注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

关于编译实现openssl验证证书链  

2013-07-09 22:44:05|  分类: openssl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        这几天在封装使用openssl验证证书链的接口,但是最终测试时总是验证通不过,当然,所验证的根证书与用户证书肯定已经使用openssl工具验证OK了。
        最终只有上网搜索,参考了“rabbit729的专栏”的“使用Openssl验证证书链”博文得以解决。好东西肯定要备份一下,在这里,顺便把该博文内容进行保存如下:

 项目中遇到使用Openssl验证证书链的问题,在网上找了很长时间,发现这方面的资料很少,通过多方努力,总算实现了基本功能,为了给大家提供 一下参考,本人实现了一个验证证书链的类,以供参考,由于本人也是刚刚接触Openssl,如果有不正确的地方,请大家多多指导


/************************************************************************/
/*                          VerifyDCChain.h                             */
/************************************************************************/
#ifndef VERIFYDCCHAIN_H_
#define VERIFYDCCHAIN_H_

#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/pem.h>
#include <openssl/crypto.h>
#include <string>
#include <iostream>
using namespace std;

class VerifyDCChain
{
public:
    VerifyDCChain();
    ~VerifyDCChain();

    /*
    * 初始化证书链堆栈m_chain
    * @param[in] certChains 证书链中各个证书文件名数组
    * @param[in] num 证书链中证书个数
    */
    int Init(const string* certChains, const int num);

    /*
    * 使用给定的证书链验证叶子证书
    * @param[in] certFile 需要验证的叶子证书文件名
    */
    int verify(const char* certFile);
private:

    /*
    * 加载证书文件
    * @param[in] certFile 需要加载的证书文件名
    */
    X509* load_certfile(const char* certFile);
private:
    X509* m_leaf;
    STACK_OF(X509)* m_chain;   
};

#endif

/************************************************************************/
/*                          VerifyDCChain.cpp                           */
/************************************************************************/

#include "VerifyDCChain.h"

VerifyDCChain::VerifyDCChain():m_leaf(NULL), m_chain(NULL)
{
    CRYPTO_malloc_init();
    OpenSSL_add_all_algorithms();
}

VerifyDCChain::~VerifyDCChain()
{
    if(m_leaf != NULL)
    {
        X509_free(m_leaf);
    }
    if (m_chain !=NULL)
    {
        sk_X509_free(m_chain);
    }
}

int VerifyDCChain::Init(const string* certChains, const int num)
{
    int ret = 0;
    X509* temp = new X509;
    m_chain = sk_X509_new_null();

    // 注意此处加载证书链中证书的顺序没有要求,因为
    // 在X509_verify_cert()函数中会对证书链中的证书
    // 进行排序
    for (int i = 0; i < num; i++)
    {
        temp = load_certfile(certChains[i].c_str());
        sk_X509_push(m_chain, temp);
    }
    return 1;
}

int VerifyDCChain::verify(const char* certFile)
{
    int ret = 0;
    X509_STORE *store=NULL;
    X509_STORE_CTX ctx;
    m_leaf = new X509();

    //创建X509_store对象,用来存储证书、撤销列表等
    store=X509_STORE_new();

    // 载入叶子证书
    m_leaf = load_certfile(certFile);

    //设置验证标记 都验证那些项 X509_V_FLAG_CRL_CHECK_ALL表示全部验证
    X509_STORE_set_flags(store,X509_V_FLAG_CRL_CHECK_ALL);
    //初始化CTX 这个类就是所谓的上下文 该类收集完必要的信息数据 可以进行验证
    // 此处X509_STORE_CTX_init最后一个参数为NULL,表示不加载证书撤销列表CPL
    if(!X509_STORE_CTX_init(&ctx,store ,m_leaf,NULL))
    {
        ret = 0;
        goto end;
    }

    if(m_chain == NULL)
    {
        cout<<"加载证书链失败!/n"<<endl;
        ret = 0;
        goto end;
    }
    else
    {
        //将证书链存入CTX
        X509_STORE_CTX_trusted_stack(&ctx, m_chain);
    }

    //证书链式验证
    if(1 == X509_verify_cert(&ctx))
        ret = 1;
    else
        ret = 0;
end:
    X509_STORE_CTX_cleanup(&ctx);
    if(store)X509_STORE_free(store);
    return ret;
}

X509* VerifyDCChain::load_certfile(const char* certFile)
{
    X509* cert = NULL;
    BIO* in = NULL;

    if(certFile==NULL)
        goto end;
    in = BIO_new_file(certFile,"r");
    if(in==NULL)
        goto end;
    //将IO中数据以PEM格式读入到X509对象
    cert = PEM_read_bio_X509(in,NULL,NULL,NULL);
    if(cert == NULL)
        goto end;
end:
    if(in)BIO_free(in);
    return cert;
}

/************************************************************************/
/*                                 test.cpp                             */
/************************************************************************/

#include "VerifyDCChain.h"
#include <iostream>
using namespace std;

void main(void)
{
    VerifyDCChain m_check;

    // 注意此处加载证书链中证书文件名的顺序没有要求,
    // 因为在X509_verify_cert()函数中会对证书链中的
    // 证书进行排序
    string certChains[4] = {"5.crt", "4.crt", "3.crt", "2.crt"};
    m_check.Init(certChains, 4);

    if (1 == m_check.verify("1.crt"))
    {
        cout<<"OK!"<<endl;
    }
    else
    {
        cout<<"ERROR!"<<endl;
    }   
}

  评论这张
 
阅读(596)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018