六、实验内容:
(1) 证书信息读取,通过程序指令显示用户证书的版本号、序列号、颁发者、拥有者、有效期限和用户的公钥
(2) 读取受信任的根证书、CA证书链、证书撤销列表和待验证的用户证书,并将其转换为X509结构体,最后验证该证书的合法性
七、实验器材(设备、元器件):
PC(Windows),VS2010,openssl配置环境
八、实验步骤:
在证书的使用过程中,需要获取证书的相关信息如序列号、颁发者的信息以及拥有者的信息,同时还需要验证证书的有效期、合法性以及证书信任链等。本实验分为两部分:证书信息读取和证书验证。
(一)证书信息读取
(1) 定义一些必须的变量,用以存储证书和证书的相关信息。参考代码如下:
unsigned char usrCertificate[4096]; //DER证书缓冲区 unsigned long usrCertificateLen; //证书长度 X509 *x509usrCert = NULL; //X509证书结构体
X509_NAME *issuer = NULL; //用于保存证书颁发者的信息 X509_NAME *subject = NULL; //用于保存证书拥有者的信息 X509_NAME_ENTRY *name_entry; //用于保存证书信息 ASN1_INTEGER *Serial = NULL; //用于保存证书序列号 ASN1_TIME *time; //用于保存证书有效期 EVP_PKEY *pubKey; //用于保存证书公钥 long Version; //用于保存证书版本
(2) 将用户的DER编码证书转化为X509结构体,并调用X509_get_***相关函数读取证书的相关信息,参考代码如下:
//调用d2i_X509函数,将用户的DER编码证书转化为X509结构体
X509usrCert = d2i_X509(NULL,&pTmp,usrCertificatelen); //读取证书版本
Version = X509_get_version(X509usrCert); //读取证书序列号
Serial = X509_get_serialNumber(X509usrCert);
//读取证书颁发者信息,包括国家、组织、部门、通用名、电子邮件地址等 issuer = X509_get_issuer_name(X509usrCert);
//读取证书拥有者信息,包括国家、组织、部门、通用名、电子邮件地址等 subject = X509_get_subject_name(X509usrCert); //读取证书的生效日期和失效日期
time = X509_get_notBefore(X509usrCert); time = X509_get_notBefore(X509usrCert); //读取证书公钥
pubKey = X509_get_pubkey(X509usrCert);
(3) 最后调用X509_free函数释放X509结构体内存。
证书信息读取的流程图如图1所示
开始开始加载根证书、CA证书、证书撤销列表和用户证书DER编码证书转换根证书、用户证书、证书撤销列表格式转换读取证书颁发者信息将根证书、证书撤销类列表添加到证书存储区读取证书拥有者信息将CA证书、用户证书添加到证书存储区读取证书有效期验证用户证书读取证书公钥释放内存释放内存 图1证书信息读取流程图 图2 证书验证流程图 (二)证书验证
(1) 定义一些必须的变量,用以存储CRL、根证书、待验证用户证书等。参
结束结束考代码如下:
unsigned char derusrCert[4096]; //DER证书缓冲区 unsigned long derusrCertLen; //证书长度
unsigned char derCrl[4096]; //DER证书撤销列表缓冲区 unsigned long derCrlLen; //证书撤销列表长度 unsigned char derRootCert[4096]; //DER根证书缓冲区 unsigned long derRootCertLen; //根证书长度 X509_STORE_CTX *ctx = NULL; //证书存储区 X509 *X509usrCert = NULL; //X509用户证书 X509 *X509CACert = NULL; //X509CA证书 X509 *X509RootCert = NULL; //X509根证书
X509_CRL *X509Crl = NULL; //X509证书撤销列表 STACK_OF(X509) *caCertStack = NULL; //CA证书链 X509_STORE *rootCertStore = NULL; //证书存储区
(2) 读取受信任的根证书、CA证书链、证书撤销列表和待验证的用户证书,并将其转换为X509结构体。参考代码如下:
//根证书转换
pTmp = derRootCert;
X509RootCert = d2i_X509(NULL,&pTmp,derRootCertLen); //用户证书转换 pTmp = derusrCert;
X509usrCert = d2i_X509(NULL,&pTmp,usrCertLen); //证书撤销列表转换 pTmp = derCrl;
X509Crl = d2i_X509(NULL,&pTmp, derCrlLen);
(3) 添加受信任的根证书和证书撤销列表到证书存储区。参考代码如下:
//新建X509证书存储区
rootCertStore = X509_Store_new(); //添加根证书
X509_STORE_add_cert(rootCertStore, X509RootCert); //设置证书撤销列表标志位
X509_STORE_set_flags(rootCertStore,X509_V_FLAG_CRL_CHECK); //添加证书撤销列表
X509_STORE_add_crl(rootCertStore,X509Crl); (4) 添加用户证书和CA证书链。参考代码如下:
ctx = X509_STORE_CTX_new();
X509_STORE_CTX_init(ctx,rootCertStore,X509usrCert, caCertStack); (5)验证证书。
X509_verify_cert(ctx); (6)释放内存。
九、实验数据及结果分析:
在实验一和二的基础上,对之前生成的证书进行读取和验证 (注:由于前两个实验结果疏于保存,所以这次试验选取的证书其实是助教给的两个“郭靖”“黄飞鸿”证书,之后的实验内容都是以此为基础)
首先是openssl环境配置;很麻烦,在Windows上面; 比如新建一个项目,没有添加路径是运行不了的。
幸好之前上学期做过openssl实验,所以只要在配置路径时加上引用的lib库,include库,以及配置链接器就可以正常引用openssl的相关函数。
相关推荐: