版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子科技大学信息与软件工程学院标 准 实 验 报 告(实验)课程名称 PKI技术电子科技大学教务处制表报告评分: 指导教师签字:电 子 科 技 大 学实 验 报 告学生姓名:杨岚青 学 号:2013220501019 指导教师: 聂旭云 实验地点: 三教407 实验时间: 2015.11.22一、实验室名称: 信息与软件工程学院通用计算机软件实验室二、实验项目名称: OpenSSL证书操作三、实验学时: 4四、实验原理:X.509 V3版本的数字证书包括以下内容:证书的版本、序列号、签名算法、证书签发者的信息、证书拥有者的信息、有效期(起始日期和终止日期)、用户的公钥、证书扩展信息(包括证书策
2、略、密钥用途等)、签发者签名算法标识和签名的结果等。证书一般都是用DER编码。OpenSSL可实现DER证书的数据转换,证书的验证、证书内容的获取等。具体用到的函数如下:(1) 证书转换函数函数功能:把一个DER编码的证书数据转化为OpenSSL内部结构题,返回值为编码后的X509结构体数据。函数定义:X509 * d2i_X509(X509 *cert, unsigned char *d, int len);参数说明:cert:X509结构体。(2) 证书版本获取函数函数功能:获取证书的版本,返回值为证书版本号,长整型。函数定义:Long X509_get_version(cert);参数说
3、明:cert:X509结构体。(3) 证书序列号获取函数函数功能:获取证书的序列号,返回值为证书的序列号,数据类型为“ASN1_INTEGER *”。函数定义:ASN1_INTEGER * X509_get_serialNumber(cert);参数说明:cert:X509结构体。(4) 证书颁发者信息获取函数函数功能:获取证书颁发者的信息,返回值数据类型为“X509_NAME *”。函数定义:X509_NAME * X509_get_issuer_name(cert);参数说明:cert:X509结构体。(5) 证书拥有者信息获取函数函数功能:获取证书使用者的信息,返回值数据类型为“X509
4、_NAME *”。函数定义:X509_NAME * X509_get_subject_name(cert);参数说明:cert:X509结构体。(6) 获取证书有效期函数函数功能:获得证书的有效期的起始日期和终止日期,返回数据类型为“ANS1_TIME *”。函数定义:ANS1_TIME * X509_get_notbefore(cert);ANS1_TIME * X509_get_notafter(cert);参数说明:cert:X509结构体。(7) 证书公钥获取函数函数功能:获取证书上的公钥,返回数据类型为“EVP_PKEY*”。函数定义:EVP_PKEY * X509_get_pubk
5、ey(cert);cert:X509结构体。(8) 证书存储区创建和释放函数函数功能:创建和释放一个X509_STORE结构体,用于证书的验证过程。函数定义:X509_STORE *X509_STORE_new(void);Void X509_STORE_free(X509_STORE *v);(9) 添加证书函数函数功能:向证书存储区添加信任的根证书。函数定义:int X509_STORE_add_cert(X509_STORE *ctx, X509 *cert);参数说明:ctx:X509_STORE类型数据,证书存储区。cert:X509结构体,受信任的根证书。(10) 添加证书撤销列表
6、函数函数功能:向证书存储区添加证书撤销列表。函数定义:int X509_STORE_add_crl(X509_STORE *ctx, X509_CRT *x);参数说明:ctx:X509_STORE*类型数据,证书存储区。x:X509_CRT *类型数据,证书撤销列表。(11) 创建和释放证书存储区上下文函数函数功能:为证书存储区上下文环境申请内存和释放内存。函数定义:X509_STORE_CTX * X509_STORE_CTX_new(void);void X509_STORE_CTX_free(X509_STORE *ctx);(12) 初始化证书存储区上下文函数函数功能:初始化证书存储
7、区上下文,设置根证书、待验证的证书、CA证书信任链。操作成功返回1,否则返回0。函数定义:Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);参数说明:ctx :X509_STORE_CTX*类型数据,上下文。store:X509_STORE*类型数据,根证书存储区。chain:STACK_OF(X509) *,证书链。(13) 验证证书函数函数功能:检查证书链,依次验证上级CA对证书的签名,一直到根证书。检查证书是否过期,是否已撤销以及其他证书策略
8、。函数定义:int X509_verify_cert(X509_STORE_CTX *ctx);参数说明:ctx :X509_STORE_CTX*类型数据,上下文。 五、实验目的: 利用OpenSSL实现对X.509数字证书的操作,包括证书的读取、证书的验证。六、实验内容: (1)证书信息读取,通过程序指令显示用户证书的版本号、序列号、颁发者、拥有者、有效期限和用户的公钥(2)读取受信任的根证书、CA证书链、证书撤销列表和待验证的用户证书,并将其转换为X509结构体,最后验证该证书的合法性七、实验器材(设备、元器件): PC(Windows),VS2010,openssl配置环境 八、实验步骤
9、:在证书的使用过程中,需要获取证书的相关信息如序列号、颁发者的信息以及拥有者的信息,同时还需要验证证书的有效期、合法性以及证书信任链等。本实验分为两部分:证书信息读取和证书验证。(一) 证书信息读取(1) 定义一些必须的变量,用以存储证书和证书的相关信息。参考代码如下:unsigned char usrCertificate4096; /DER证书缓冲区unsigned long usrCertificateLen; /证书长度X509 *x509usrCert = NULL; /X509证书结构体X509_NAME *issuer = NULL; /用于保存证书颁发者的信息X509_NAME
10、 *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_X5
11、09(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);/读取证书的生效日期
12、和失效日期time = X509_get_notBefore(X509usrCert);time = X509_get_notBefore(X509usrCert);/读取证书公钥pubKey = X509_get_pubkey(X509usrCert); (3) 最后调用X509_free函数释放X509结构体内存。证书信息读取的流程图如图1所示图1证书信息读取流程图 图2 证书验证流程图(二) 证书验证(1) 定义一些必须的变量,用以存储CRL、根证书、待验证用户证书等。参考代码如下:unsigned char derusrCert4096; /DER证书缓冲区unsigned long
13、derusrCertLen; /证书长度 unsigned char derCrl4096; /DER证书撤销列表缓冲区unsigned long derCrlLen; /证书撤销列表长度unsigned char derRootCert4096; /DER根证书缓冲区 unsigned long derRootCertLen; /根证书长度X509_STORE_CTX *ctx = NULL; /证书存储区 X509 *X509usrCert = NULL; /X509用户证书X509 *X509CACert = NULL; /X509CA证书X509 *X509RootCert = NUL
14、L; /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;X509usr
15、Cert = 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_
16、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)释放内存。 九、实验数据及结果分析:在实验一和二的基础上,对之前生成的证书进行读取和验证(注: 由于前两个实验结果疏于保存,所以这次试验选取的证书其实是助教给的两个“郭靖
17、” “黄飞鸿” 证书,之后的实验内容都是以此为基础)首先是openssl环境配置; 很麻烦,在Windows上面;比如新建一个项目,没有添加路径是运行不了的。幸好之前上学期做过openssl实验,所以只要在配置路径时加上引用的lib库,include库,以及配置链接器就可以正常引用openssl的相关函数。以下步骤依次完成证书的读取和验证过程,参照指导书,列出流程:证书信息读取的流程图如图1所示实验代码:#include <openssl/evp.h>#include <openssl/x509.h>#include <cstdio>#include <
18、;cstdlib>#include <cstring>#include <windows.h>#define MAX_CERT_LEN 4096extern enum File_typeROOT_CA=1,USER_CA=2,CRL=4File_type;extern enum Imformation_typeCA_VERSION,CA_SERIAL_NUMBER,CA_NOT_BEFORE,CA_NOT_AFTER,CA_PUBLIC_KEY,CA_COUNTRY_NUMBER=14,CA_STATE_PROVINCE_NAME=16,CA_LOCALITY_N
19、AME=15,CA_ORGANIZATION_NAME=17,CA_ORGANIZATIONAL_UNIT_NAME=18,CA_COMMON_NAME=13,CA_PKCS9_EMAILADDRESS=48Imformation_type;class CertVerfierprivate:X509 *rootCA;X509 *userCA;X509_CRL *crl;X509_STORE *rootCAstore;X509_STORE_CTX *ctx;STACK_OF(X509) *CAstack;char msginfo1024;void Der2X509(const unsigned
20、char* der_buffer,int der_buffer_len,int file_type);public:CertVerfier();int LoadCertFile(const char*filename,int file_type);int Verify();const char* Get_error_str();const char* Get_CA_information(int file_type,int information_type,bool is_issuer_info=false);int Reset(int reset_type);CertVerfier();/c
21、ode by dnpbob#include"cert_verify.h"/private functionvoid CertVerfier: Der2X509(const unsigned char* der_buffer,int der_buffer_len,int file_type)switch(file_type)case ROOT_CA:if(!rootCA)rootCA=d2i_X509(NULL,&der_buffer,der_buffer_len);break;case USER_CA:if(!userCA)userCA=d2i_X509(NULL,
22、&der_buffer,der_buffer_len);break;case CRL:if(!crl)crl=d2i_X509_CRL(NULL,&der_buffer,der_buffer_len);break;/public functionCertVerfier:CertVerfier()rootCA=NULL;userCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;CAstack=NULL;int CertVerfier:LoadCertFile(const char*filename,int file_type)FILE *fp;
23、unsigned char der_bufferMAX_CERT_LEN;int der_buffer_len;if(file_type!=ROOT_CA&&file_type!=USER_CA&&file_type!=CRL)return -1;fp=fopen(filename,"rb");if(!fp)return -1;if(file_type=ROOT_CA&&rootCA)Reset(ROOT_CA);if(file_type=USER_CA&&userCA)Reset(USER_CA);if(fi
24、le_type=CRL&&crl)Reset(CRL);der_buffer_len=fread(der_buffer,1,MAX_CERT_LEN,fp);Der2X509(der_buffer,der_buffer_len,file_type);fclose(fp);return 0;int CertVerfier:Verify()if(rootCA&&userCA&&crl)if(!rootCAstore)rootCAstore=X509_STORE_new();X509_STORE_add_cert(rootCAstore,rootCA)
25、;X509_STORE_set_flags(rootCAstore,X509_V_FLAG_CRL_CHECK);X509_STORE_add_crl(rootCAstore,crl);if(!ctx)ctx=X509_STORE_CTX_new();X509_STORE_CTX_init(ctx,rootCAstore,userCA,CAstack);return X509_verify_cert(ctx);elsereturn -1;const char* CertVerfier:Get_error_str()if(ctx)return X509_verify_cert_error_str
26、ing(ctx->error);const char* CertVerfier:Get_CA_information(int file_type,int information_type,bool is_issuer_info)X509 *CA;X509_NAME *issuer_or_subject=NULL;int entriesNum;X509_NAME_ENTRY *name_entry;ASN1_INTEGER *Serial = NULL;ASN1_TIME *time;EVP_PKEY *pubKey;int Version;int NID;unsigned char de
27、rpubkey1024,*Ptr;int derpubkeyLen;int msginfoLen;LPWSTR pUtf8 = NULL;int nUtf8;int rv;int i;char*msginfo_temp;switch(file_type)case ROOT_CA:CA=rootCA;break;case USER_CA:CA=userCA;break;default:return NULL;switch(information_type)case CA_VERSION:Version=X509_get_version(CA);itoa(Version,msginfo,10);r
28、eturn msginfo;case CA_SERIAL_NUMBER:Serial=X509_get_serialNumber(CA);for(msginfo_temp=msginfo,i=0; i<Serial->length; i+,msginfo_temp+=2)itoa(Serial->datai,msginfo_temp,16);if(Serial->datai<16)*(msginfo_temp+1)=*msginfo_temp;*msginfo_temp='0'*(msginfo_temp+1)='0'return
29、msginfo;case CA_NOT_BEFORE:time=X509_get_notBefore(CA);for(i=0;time->datai!='0'i+)msginfoi=time->datai;msginfoi='0'return msginfo;case CA_NOT_AFTER:time=X509_get_notAfter(CA);for(i=0;time->datai!='0'i+)msginfoi=time->datai;msginfoi='0'return msginfo;case C
30、A_PUBLIC_KEY:pubKey=X509_get_pubkey(CA);Ptr=derpubkey;derpubkeyLen=i2d_PublicKey(pubKey,&Ptr);for(msginfo_temp=msginfo,i=0;i<derpubkeyLen;i+,msginfo_temp+=2)itoa(derpubkeyi,msginfo_temp,16);if(derpubkeyi<16)*(msginfo_temp+1)=*msginfo_temp;*msginfo_temp='0' *(msginfo_temp+1)='0&
31、#39;return msginfo;switch(is_issuer_info)case false:issuer_or_subject = X509_get_subject_name(CA);if(!(name_entry=sk_X509_NAME_ENTRY_value(issuer_or_subject->entries,0)strcpy(msginfo,"No issuer's infomation");return msginfo;NID=OBJ_obj2nid(name_entry->object);break;case true:issu
32、er_or_subject=X509_get_issuer_name(CA);if(!(name_entry=sk_X509_NAME_ENTRY_value(issuer_or_subject->entries,0)strcpy(msginfo,"No subject's information");return msginfo;NID=OBJ_obj2nid(name_entry->object);break;for(i=0;NID!=information_type;i+)if(!(name_entry=sk_X509_NAME_ENTRY_val
33、ue(issuer_or_subject->entries,i)strcpy(msginfo,"Not Found");return msginfo;NID=OBJ_obj2nid(name_entry->object);if(name_entry->value->type=V_ASN1_UTF8STRING)nUtf8 = 2*name_entry->value->length;pUtf8 = (LPWSTR)malloc(nUtf8);memset(pUtf8,0,nUtf8);rv = MultiByteToWideChar(CP_
34、UTF8,0, (char*)name_entry->value->data, name_entry->value->length, pUtf8, nUtf8);rv = WideCharToMultiByte(CP_ACP, 0, pUtf8, rv, (char*)msginfo, nUtf8, NULL, NULL);free(pUtf8);pUtf8 = NULL;msginfoLen = rv;msginfomsginfoLen='0'elsemsginfoLen=name_entry->value->length;memcpy(m
35、sginfo,name_entry->value->data,msginfoLen);msginfomsginfoLen='0'return msginfo;int CertVerfier:Reset(int reset_type)switch(reset_type)case ROOT_CA:X509_free(rootCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;ctx=NULL;rootCAstore=NULL;b
36、reak;case USER_CA:X509_free(userCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);userCA=NULL;ctx=NULL;break;case CRL:X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);crl=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+CRL:X509_free(rootCA
37、);X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;case CRL+USER_CA:X509_free(userCA);X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);userCA=N
38、ULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+USER_CA:X509_free(rootCA);X509_free(userCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;userCA=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+CRL+USER_CA:X509_free(rootCA);X509_free(userCA)
39、;X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;userCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;default:return -1;return 0;CertVerfier:CertVerfier()Reset(ROOT_CA+CRL+USER_CA);%main.cpp文?件t%#include<iostream>#include"ce
40、rt_verify.h"using namespace std;int main(void)int CA,ret,CA_list=ROOT_CA,USER_CA;bool is_issuer,is_issuer_options=true,false;const char *userCA_filenames="guest1.cer","guest2.cer"CertVerfier cv;ret=cv.LoadCertFile("root.cer",ROOT_CA);if(ret=-1)cout<<"Loa
41、ding fail."return 0;ret=cv.LoadCertFile("crl.crl",CRL);if(ret=-1)cout<<"Loading fail."return 0;cout<<"Done loading files(root.cert crl.crl)."<<endl<<endl;for(int k=0;k<2;k+)cout<<"Verify: "<<userCA_filenamesk<<
42、endl;ret=cv.LoadCertFile(userCA_filenamesk,USER_CA);if(ret=-1)cout<<"Loading fail."continue;ret=cv.Verify();if(ret!=1)cout<<"Verifying fail: "<<cv.Get_error_str()<<endl;cout<<"-=Detailed information=-"<<endl;for(int i=0;i<2;i+)CA=C
43、A_listi;char* CA_description;if(CA=ROOT_CA)CA_description="Root "elseCA_description="User "cout<<CA_description<<"CA serial number: "<<cv.Get_CA_information(USER_CA,CA_SERIAL_NUMBER)<<endl;cout<<CA_description<<"CA version: "
44、;<<cv.Get_CA_information(USER_CA,CA_VERSION)<<endl;cout<<CA_description<<"CA publickey: "<<cv.Get_CA_information(USER_CA,CA_PUBLIC_KEY)<<endl;for(int j=0;j<2;j+)is_issuer=is_issuer_optionsi;char* options_description;if(is_issuer)options_description=&q
45、uot;CA's issuer "elseoptions_description=""cout<<CA_description<<options_description<<"CA not before time: "<<cv.Get_CA_information(USER_CA,CA_NOT_BEFORE,is_issuer)<<endl;cout<<CA_description<<options_description<<"CA not after time: "<<cv.Get_CA_information(USER_CA,CA_COUNTRY_N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大数据在各个领域的应用实战指南
- 私募股权基金行业人才培养及职业发展方案
- 幼儿园绿植征集通知书
- 广东省延迟返校通知书
- 广华家园停水通知书
- 广电大厦封控通知书
- 广阳区高中放假通知书
- 建搅拌站停工通知书
- 开学自愿返校通知书
- 张庄员工返岗通知书
- 巡检记录表巡检记录表
- 2023年度青春期家庭教育调查报告
- 音乐生职业生涯规划书
- 大气课设案例
- GB/T 23617-2009林业检疫性有害生物调查总则
- GB 17498.2-2008固定式健身器材第2部分:力量型训练器材附加的特殊安全要求和试验方法
- 安全员之A证(企业负责人)【含答案】
- 二年级硬笔书法教学课件
- 部编 二年级语文上册 第五单元【集体备课】课件
- 配电线路巡视-配电线路运行与维护
- 2022年《工程化学》教案
评论
0/150
提交评论