Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3109364
  • 博文数量: 396
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4209
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(396)

文章存档

2022年(1)

2021年(2)

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: 嵌入式

2018-10-15 22:02:27

现有的证书大都采用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 plain copy
 
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  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\n");  
  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\n");  
  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\n");  
  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\n");  
  62.         return -1;  
  63.     }  
  64.       
  65.     usrCertificate2Len = fread(usrCertificate2,1,4096,fp);  
  66.     fclose(fp);  
  67.       
  68.       
  69.     printf("1\n");  
  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\n",ERR_reason_error_string(ERR_get_error()));  
  74.         return -1;  
  75.     }  
  76.     printf("2\n");  
  77.     pTmp = usrCertificate1;  
  78.     usrCert1 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate1Len);  
  79.     if(usrCert1 == NULL){  
  80.         perror("d2i_X509 failed\n");  
  81.         return -1;  
  82.     }  
  83.     printf("3\n");  
  84.     pTmp = usrCertificate2;  
  85.     usrCert2 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate2Len);  
  86.     if(usrCert2 == NULL){  
  87.         perror("d2i_X509 failed\n");  
  88.         return -1;  
  89.     }  
  90.     printf("4\n");  
  91.     pTmp = derCrl;  
  92.     Crl = d2i_X509_CRL(NULL,(unsigned const char **)&pTmp,derCrlLen);  
  93.     if(Crl == NULL){  
  94.         perror("d2i_X509 failed\n");  
  95.         return -1;  
  96.     }  
  97.     printf("5\n");  
  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\n");  
  103.     rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert1,caCertStack);  
  104.     printf("1234\n");  
  105.     if(rv != 1){  
  106.         perror("X509_STORE_CTX_init failed\n");  
  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\n",ctx->error,X509_verify_cert_error_string(ctx->error));  
  120.     }else{  
  121.         printf("verify usercert1 ok\n");  
  122.     }  
  123.       
  124.       
  125.     rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert2,caCertStack);  
  126.     if(rv != 1){  
  127.         perror("X509_STORE_CTX_init failed\n");  
  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\n",ctx->error,X509_verify_cert_error_string(ctx->error));  
  141.     }else{  
  142.         printf("verify usercert2 ok\n");  
  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();  

阅读(1340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~