openssl - X509證書操做函數

 

原文連接: http://blog.csdn.net/zqt520/article/details/26965797數據結構

現有的證書大都採用X。509規範,主要同如下信息組成:版本號、證書序列號、有效期、擁有者信息、頒發者信息、其餘擴展信息、擁有者的公鑰、CA對以上信息的簽名。
OpenSSL實現了對X。509數字證書的全部操做。包括簽發數字證書、解析和驗證證書等。
涉及證書操做的主要函數有驗證證書(驗證證書鏈、有效期、CRL)、解析證書(得到證書的版本、序列號、頒發者信息、主題信息、公鑰、有效期等)。

主要函數
一、  DER編碼轉換爲內部結構函數
X509 *d2i_X509(X509 **cert, unsigned char **d, int len);
函數功能:把一個DER編碼的證書數據轉化成OpenSSL內部結構體。
參數:cert:[OUT]X509結構體。 D:[IN]DER編碼的證書數據指針地址。Len證書數據長度;
返回值:編碼後的X509結構體數據
二、  得到證書版本函數X509_get_version
#define X509_get_version(x)  ASN1_INTEGER_get((x)->cert_info->version)
參數:x:[IN]X509*結構體數據結構。
返回值:證書版本,數據類型「LONG」
三、  得到證書序列號函數
ASN1_INTEGER *X509_get_serialNumber(X509 *x);
返回值:證書序列號,數據類型「ASN1_INTEGER」.
四、  得到證書頒發者信息函數
X509_NAME *X509_get_issuer_name(X509 *a);
注*:X509_NAME結構體包括多個X509_NAME_ENTRY結構體。X509_NAME_ENTRY保存了頒發者的信息,這些信息包括對象和值(object 和value)。對象的類型包括國家、通用名、單位、組織、地區、郵件等。
五、  得到證書擁有者信息函數
X509_NAME *X509_get_subject_name(X509 *a);
六、  得到證書有效期的起始日期函數
#define X509_get_notBefore(x)        ((x)->cert_info->validity->notBefore)
返回值:證書起始有效期,數據類型「ASN1_TIME」
七、  得到證書有效期的終止日期函數
#define X509_get_notAfter(x)           ((x)->cert_info->validity->notAfter)
八、  得到證書公鑰函數
EVP_PKEY *X509_get_pubkey(X509 *x);
九、  建立和釋放證書存儲區
X509_STORE *X509_STORE_new(void);
Void X509_STORE_free(X509_STORE *v);
函數功能:建立和釋放一個X509_STORE結構體,主要用於驗證證書。
十、向證書存儲區添加證書
Int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
函數功能:添加信任的根證書到證書存儲區。
返回值:1成功,不然爲0
十一、向證書存儲區添加證書吊銷列表
Int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
功能:添加CRL到證書存儲區。
參數:x:證書吊銷列表。Ctx:證書存儲區。
返回值:1成功,不然爲0。
十二、建立證書存儲區上下文環境函數
         X509_STORE_CTX *X509_STORE_CTX_new(void);
返回值:操做成功返回證書存儲區上下文環境指針,不然返回NULL。
1三、釋放證書存儲區上下文環境
         Void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
1四、初始化證書存儲區上下文環境函數
         Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);
函數功能:初始化證書存儲區上下文環境,設置根證書、待驗證的證書、CA證書鏈。
1五、驗證證書函數
         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\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();  
    160. }  
相關文章
相關標籤/搜索