• openssl


    原文链接: http://blog.csdn.net/zqt520/article/details/26965797

    现有的证书大都采用X。509规范,主要同以下信息组成:版本号、证书序列号、有效期、拥有者信息、颁发者信息、其他扩展信息、拥有者的公钥、CA对以上信息的签名。
    OpenSSL实现了对X。509数字证书的所有操作。包括签发数字证书、解析和验证证书等。
    涉及证书操作的主要函数有验证证书(验证证书链、有效期、CRL)、解析证书(获得证书的版本、序列号、颁发者信息、主题信息、公钥、有效期等)。

    主要函数
    1、  DER编码转换为内部结构函数
    X509 *d2i_X509(X509 **cert, unsigned char **d, int len);
    函数功能:把一个DER编码的证书数据转化成OpenSSL内部结构体。
    参数:cert:[OUT]X509结构体。 D:[IN]DER编码的证书数据指针地址。Len证书数据长度;
    返回值:编码后的X509结构体数据
    2、  获得证书版本函数X509_get_version
    #define X509_get_version(x)  ASN1_INTEGER_get((x)->cert_info->version)
    参数:x:[IN]X509*结构体数据结构。
    返回值:证书版本,数据类型“LONG”
    3、  获得证书序列号函数
    ASN1_INTEGER *X509_get_serialNumber(X509 *x);
    返回值:证书序列号,数据类型“ASN1_INTEGER”.
    4、  获得证书颁发者信息函数
    X509_NAME *X509_get_issuer_name(X509 *a);
    注*:X509_NAME结构体包括多个X509_NAME_ENTRY结构体。X509_NAME_ENTRY保存了颁发者的信息,这些信息包括对象和值(object 和value)。对象的类型包括国家、通用名、单位、组织、地区、邮件等。
    5、  获得证书拥有者信息函数
    X509_NAME *X509_get_subject_name(X509 *a);
    6、  获得证书有效期的起始日期函数
    #define X509_get_notBefore(x)        ((x)->cert_info->validity->notBefore)
    返回值:证书起始有效期,数据类型“ASN1_TIME”
    7、  获得证书有效期的终止日期函数
    #define X509_get_notAfter(x)           ((x)->cert_info->validity->notAfter)
    8、  获得证书公钥函数
    EVP_PKEY *X509_get_pubkey(X509 *x);
    9、  创建和释放证书存储区
    X509_STORE *X509_STORE_new(void);
    Void X509_STORE_free(X509_STORE *v);
    函数功能:创建和释放一个X509_STORE结构体,主要用于验证证书。
    10、向证书存储区添加证书
    Int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
    函数功能:添加信任的根证书到证书存储区。
    返回值:1成功,否则为0
    11、向证书存储区添加证书吊销列表
    Int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
    功能:添加CRL到证书存储区。
    参数:x:证书吊销列表。Ctx:证书存储区。
    返回值:1成功,否则为0。
    12、创建证书存储区上下文环境函数
             X509_STORE_CTX *X509_STORE_CTX_new(void);
    返回值:操作成功返回证书存储区上下文环境指针,否则返回NULL。
    13、释放证书存储区上下文环境
             Void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
    14、初始化证书存储区上下文环境函数
             Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);
    函数功能:初始化证书存储区上下文环境,设置根证书、待验证的证书、CA证书链。
    15、验证证书函数
             Int X509_verify_cert(X509_STORE_CTX *ctx);
    返回值:验证成功返回1,否则返回0

     

     

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
      1. #include <stdio.h>  
      2. #include <string.h>  
      3. #include <openssl/evp.h>  
      4. #include <openssl/x509.h>  
      5.   
      6. int tX509_Verify()  
      7. {  
      8.     unsigned char usrCertificate1[4096];  
      9.     unsigned long usrCertificate1Len;  
      10.     unsigned char usrCertificate2[4096];  
      11.     unsigned long usrCertificate2Len;  
      12.       
      13.     unsigned char derCrl[4096];  
      14.     unsigned long derCrlLen;  
      15.     unsigned char derRootCert[4096];  
      16.     unsigned long derRooCertLen;  
      17.     int i,rv;  
      18.       
      19.     X509_STORE_CTX *ctx = NULL;  
      20.     X509 *usrCert1 = NULL;  
      21.     X509 *usrCert2 = NULL;  
      22.     X509 *caCert = NULL;  
      23.     X509 *rootCert = NULL;  
      24.     X509_CRL *Crl = NULL;  
      25.     STACK_OF(X509) *caCertStack = NULL;  
      26.     X509_STORE *rootCertStore = NULL;  
      27.     int j = 0;  
      28.     unsigned char *pTmp = NULL;  
      29.     FILE *fp;  
      30.       
      31.     fp = fopen("RayCA.cert.cer","rb");  
      32.     if(fp == NULL){  
      33.         perror("open file failed ");  
      34.         return -1;  
      35.     }  
      36.       
      37.     derRooCertLen = fread(derRootCert,1,4096,fp);  
      38.     fclose(fp);  
      39.       
      40.     fp = fopen("crl.crl","rb");  
      41.     if(fp == NULL){  
      42.         perror("open file failed ");  
      43.         return -1;  
      44.     }  
      45.       
      46.     derCrlLen = fread(derCrl,1,4096,fp);  
      47.     fclose(fp);  
      48.       
      49.       
      50.     fp = fopen("sangerhoo_req.pem.cert.cer","rb");  
      51.     if(fp == NULL){  
      52.         perror("open file failed ");  
      53.         return -1;  
      54.     }  
      55.     usrCertificate1Len = fread(usrCertificate1,1,4096,fp);  
      56.     fclose(fp);  
      57.       
      58.       
      59.     fp = fopen("myserver.cert.cer","rb");  
      60.     if(fp == NULL){  
      61.         perror("open file failed ");  
      62.         return -1;  
      63.     }  
      64.       
      65.     usrCertificate2Len = fread(usrCertificate2,1,4096,fp);  
      66.     fclose(fp);  
      67.       
      68.       
      69.     printf("1 ");  
      70.     pTmp =  derRootCert;  
      71.     rootCert = d2i_X509(NULL,(unsigned const char **)&pTmp,derRooCertLen);  
      72.     if( NULL == rootCert){  
      73.         printf("d2i_X509 failed1,ERR_get_error=%s ",ERR_reason_error_string(ERR_get_error()));  
      74.         return -1;  
      75.     }  
      76.     printf("2 ");  
      77.     pTmp = usrCertificate1;  
      78.     usrCert1 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate1Len);  
      79.     if(usrCert1 == NULL){  
      80.         perror("d2i_X509 failed ");  
      81.         return -1;  
      82.     }  
      83.     printf("3 ");  
      84.     pTmp = usrCertificate2;  
      85.     usrCert2 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate2Len);  
      86.     if(usrCert2 == NULL){  
      87.         perror("d2i_X509 failed ");  
      88.         return -1;  
      89.     }  
      90.     printf("4 ");  
      91.     pTmp = derCrl;  
      92.     Crl = d2i_X509_CRL(NULL,(unsigned const char **)&pTmp,derCrlLen);  
      93.     if(Crl == NULL){  
      94.         perror("d2i_X509 failed ");  
      95.         return -1;  
      96.     }  
      97.     printf("5 ");  
      98.     rootCertStore = X509_STORE_new();  
      99.     X509_STORE_add_cert(rootCertStore,rootCert);  
      100.     X509_STORE_set_flags(rootCertStore,X509_V_FLAG_CRL_CHECK);  
      101.     X509_STORE_add_crl(rootCertStore,Crl);  
      102.     printf("6 ");  
      103.     rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert1,caCertStack);  
      104.     printf("1234 ");  
      105.     if(rv != 1){  
      106.         perror("X509_STORE_CTX_init failed ");  
      107.         X509_free(usrCert1);  
      108.         X509_free(usrCert2);  
      109.         X509_free(rootCert);  
      110.         X509_STORE_CTX_cleanup(ctx);  
      111.         X509_STORE_CTX_free(ctx);  
      112.         X509_STORE_free(rootCertStore);  
      113.         return -1;  
      114.     }  
      115.       
      116.       
      117.     rv = X509_verify_cert(ctx);  
      118.     if(rv != 1){  
      119.         printf("verify usercert1 failed err=%d,info:%s ",ctx->error,X509_verify_cert_error_string(ctx->error));  
      120.     }else{  
      121.         printf("verify usercert1 ok ");  
      122.     }  
      123.       
      124.       
      125.     rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert2,caCertStack);  
      126.     if(rv != 1){  
      127.         perror("X509_STORE_CTX_init failed ");  
      128.         X509_free(usrCert1);  
      129.         X509_free(usrCert2);  
      130.         X509_free(rootCert);  
      131.         X509_STORE_CTX_cleanup(ctx);  
      132.         X509_STORE_CTX_free(ctx);  
      133.         X509_STORE_free(rootCertStore);  
      134.         return -1;  
      135.     }  
      136.       
      137.       
      138.     rv = X509_verify_cert(ctx);  
      139.     if(rv != 1){  
      140.         printf("verify usercert2 failed err=%d,info:%s ",ctx->error,X509_verify_cert_error_string(ctx->error));  
      141.     }else{  
      142.         printf("verify usercert2 ok ");  
      143.     }  
      144.       
      145.       
      146.     X509_free(usrCert1);  
      147.     X509_free(usrCert2);  
      148.     X509_free(rootCert);  
      149.     X509_STORE_CTX_cleanup(ctx);  
      150.     X509_STORE_CTX_free(ctx);  
      151.     X509_STORE_free(rootCertStore);  
      152.     return 0;  
      153.       
      154. }  
      155.   
      156.   
      157. int main()  
      158. {  
      159.     tX509_Verify();  
      160. }  
  • 相关阅读:
    Java编程思想读书笔记 第十章 内部类
    利用lambda和条件表达式构造匿名递归函数
    概率论与数理统计-课程小报告
    leetcode226 翻转二叉树
    leetcode199 二叉树的右视图
    leetcode114- 二叉树展开为链表
    leetcode145 二叉树的后序遍历 特别注意迭代
    leet144 二叉树的前序遍历
    leetcode113 路径总和2 特别关注
    leetcode 112 路径总和 特别关注
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4791724.html
Copyright © 2020-2023  润新知