ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:406.67KB ,
资源ID:1991001      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1991001.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PKI实验三版本一.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

PKI实验三版本一.docx

1、PKI实验三版本一电子科技大学信息与软件工程学院标 准 实 验 报 告(实验)课程名称 PKI技术电子科技大学教务处制表报告评分: 指导教师签字:电 子 科 技 大 学实 验 报 告学生姓名:杨岚青 学 号:* * * 实验地点: 三教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);参数说明:cert:X509

3、结构体。(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_NAME *”。函数定义:

4、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_pubkey(cert);cert:X5

5、09结构体。(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)初始化证书存储区上下文函数函数功能:初始化证书存储区上下文,设置根证书、待验证的证书、CA证

7、书信任链。操作成功返回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对证书的签名,一直到根证书。检查证书是否过期,是否已撤销以及其他证书策略。函数定义:int X509_verify_

8、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 *subject = NULL; /用于保

10、存证书拥有者的信息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,usrCertif

11、icatelen);/读取证书版本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_notBef

12、ore(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 derusrCertLen; /证书长度 unsigned

13、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 = NULL; /X509根证书X509_CRL *X509Crl =

14、 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,usrCertL

15、en);/证书撤销列表转换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(

16、rootCertStore,X509Crl);(4)添加用户证书和CA证书链。参考代码如下:ctx = X509_STORE_CTX_new();X509_STORE_CTX_init(ctx,rootCertStore,X509usrCert, caCertStack);(5)验证证书。X509_verify_cert(ctx);(6)释放内存。 九、实验数据及结果分析:在实验一和二的基础上,对之前生成的证书进行读取和验证(注: 由于前两个实验结果疏于保存,所以这次试验选取的证书其实是助教给的两个“郭靖” “黄飞鸿” 证书,之后的实验内容都是以此为基础)首先是openssl环境配置; 很麻烦

17、,在Windows上面;比如新建一个项目,没有添加路径是运行不了的。幸好之前上学期做过openssl实验,所以只要在配置路径时加上引用的lib库,include库,以及配置链接器就可以正常引用openssl的相关函数。以下步骤依次完成证书的读取和验证过程,参照指导书,列出流程:证书信息读取的流程图如图1所示实验代码:#include #include #include #include #include #include #define MAX_CERT_LEN 4096extern enum File_type ROOT_CA=1, USER_CA=2, CRL=4File_type;ext

18、ern enum Imformation_type CA_VERSION, CA_SERIAL_NUMBER, CA_NOT_BEFORE, CA_NOT_AFTER, CA_PUBLIC_KEY, CA_COUNTRY_NUMBER=14, CA_STATE_PROVINCE_NAME=16, CA_LOCALITY_NAME=15, CA_ORGANIZATION_NAME=17, CA_ORGANIZATIONAL_UNIT_NAME=18, CA_COMMON_NAME=13, CA_PKCS9_EMAILADDRESS=48Imformation_type;class CertVer

19、fierprivate: X509 *rootCA; X509 *userCA; X509_CRL *crl; X509_STORE *rootCAstore; X509_STORE_CTX *ctx; STACK_OF(X509) *CAstack; char msginfo1024; void Der2X509(const unsigned char* der_buffer,int der_buffer_len,int file_type);public: CertVerfier(); int LoadCertFile(const char*filename,int file_type);

20、 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();/code by dnpbob#includecert_verify.h /private functionvoid CertVerfier: Der2X509(const unsigned char* der_buffer,int der_

21、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,&der_buffer,der_buffer_len); break; case CRL: if(!crl) crl=d2i_X509_CRL(NULL,&der_buffer,der_buffer_len); break; /public funct

22、ionCertVerfier: CertVerfier() rootCA=NULL; userCA=NULL; crl=NULL; ctx=NULL; rootCAstore=NULL; CAstack=NULL;int CertVerfier:LoadCertFile(const char*filename,int file_type) FILE *fp; unsigned char der_bufferMAX_CERT_LEN; int der_buffer_len; if(file_type!=ROOT_CA&file_type!=USER_CA&file_type!=CRL) retu

23、rn -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(file_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 Cer

24、tVerfier:Verify() if(rootCA&userCA&crl) if(!rootCAstore) rootCAstore=X509_STORE_new(); X509_STORE_add_cert(rootCAstore,rootCA); 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,

25、CAstack); return X509_verify_cert(ctx); else return -1;const char* CertVerfier:Get_error_str() if(ctx) return X509_verify_cert_error_string(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 e

26、ntriesNum; X509_NAME_ENTRY *name_entry; ASN1_INTEGER *Serial = NULL; ASN1_TIME *time; EVP_PKEY *pubKey; int Version; int NID; unsigned char derpubkey1024,*Ptr; int derpubkeyLen; int msginfoLen; LPWSTR pUtf8 = NULL; int nUtf8; int rv; int i; char*msginfo_temp; switch(file_type) case ROOT_CA: CA=rootC

27、A; 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); return msginfo; case CA_SERIAL_NUMBER: Serial=X509_get_serialNumber(CA); for(msginfo_temp=msginfo,i=0; ilength; i+,msginfo_temp+=2) itoa(S

28、erial-datai,msginfo_temp,16); if(Serial-dataidatai!=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 CA_PUBLIC_KEY: pubKey=X509_get_pubkey(CA); Ptr=derpubkey; derpubkeyLen=i2d_PublicKey(pubKey,&Ptr); for(msginfo_temp=msginfo,i=0;iderpubkeyLen;i+,msginfo_temp+=2) itoa(derpubkeyi,msginfo_temp,16); if(derpubkeyi16) *(msginfo_temp+1)=*msginfo_temp; *msginfo_temp=0; *(msginfo_temp+1)=0; return msginfo;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2