原文連接: 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函數
- #include <stdio.h>
- #include <string.h>
- #include <openssl/evp.h>
- #include <openssl/x509.h>
-
- int tX509_Verify()
- {
- unsigned char usrCertificate1[4096];
- unsigned long usrCertificate1Len;
- unsigned char usrCertificate2[4096];
- unsigned long usrCertificate2Len;
-
- unsigned char derCrl[4096];
- unsigned long derCrlLen;
- unsigned char derRootCert[4096];
- unsigned long derRooCertLen;
- int i,rv;
-
- X509_STORE_CTX *ctx = NULL;
- X509 *usrCert1 = NULL;
- X509 *usrCert2 = NULL;
- X509 *caCert = NULL;
- X509 *rootCert = NULL;
- X509_CRL *Crl = NULL;
- STACK_OF(X509) *caCertStack = NULL;
- X509_STORE *rootCertStore = NULL;
- int j = 0;
- unsigned char *pTmp = NULL;
- FILE *fp;
-
- fp = fopen("RayCA.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
-
- derRooCertLen = fread(derRootCert,1,4096,fp);
- fclose(fp);
-
- fp = fopen("crl.crl","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
-
- derCrlLen = fread(derCrl,1,4096,fp);
- fclose(fp);
-
-
- fp = fopen("sangerhoo_req.pem.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
- usrCertificate1Len = fread(usrCertificate1,1,4096,fp);
- fclose(fp);
-
-
- fp = fopen("myserver.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
-
- usrCertificate2Len = fread(usrCertificate2,1,4096,fp);
- fclose(fp);
-
-
- printf("1\n");
- pTmp = derRootCert;
- rootCert = d2i_X509(NULL,(unsigned const char **)&pTmp,derRooCertLen);
- if( NULL == rootCert){
- printf("d2i_X509 failed1,ERR_get_error=%s\n",ERR_reason_error_string(ERR_get_error()));
- return -1;
- }
- printf("2\n");
- pTmp = usrCertificate1;
- usrCert1 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate1Len);
- if(usrCert1 == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("3\n");
- pTmp = usrCertificate2;
- usrCert2 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate2Len);
- if(usrCert2 == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("4\n");
- pTmp = derCrl;
- Crl = d2i_X509_CRL(NULL,(unsigned const char **)&pTmp,derCrlLen);
- if(Crl == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("5\n");
- rootCertStore = X509_STORE_new();
- X509_STORE_add_cert(rootCertStore,rootCert);
- X509_STORE_set_flags(rootCertStore,X509_V_FLAG_CRL_CHECK);
- X509_STORE_add_crl(rootCertStore,Crl);
- printf("6\n");
- rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert1,caCertStack);
- printf("1234\n");
- if(rv != 1){
- perror("X509_STORE_CTX_init failed\n");
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return -1;
- }
-
-
- rv = X509_verify_cert(ctx);
- if(rv != 1){
- printf("verify usercert1 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
- }else{
- printf("verify usercert1 ok\n");
- }
-
-
- rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert2,caCertStack);
- if(rv != 1){
- perror("X509_STORE_CTX_init failed\n");
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return -1;
- }
-
-
- rv = X509_verify_cert(ctx);
- if(rv != 1){
- printf("verify usercert2 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
- }else{
- printf("verify usercert2 ok\n");
- }
-
-
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return 0;
-
- }
-
-
- int main()
- {
- tX509_Verify();
- }