OpenSSL之X509系列Word格式.docx
- 文档编号:16516489
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:9
- 大小:20.18KB
OpenSSL之X509系列Word格式.docx
《OpenSSL之X509系列Word格式.docx》由会员分享,可在线阅读,更多相关《OpenSSL之X509系列Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
在一份证书中,必须证明公钥及其所有者的姓名是一致的。
对PGP证书来说,任何人都可以扮演认证者的角色。
对X.509证书来说,认证者总是CA或由CA指定的人(其实PGP证书也完全支持使用CA来确认证书的体系结构),一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
X.509标准定义了证书中应该包含哪些信息,并描述了这些信息是如何编码的(即数据格式),所有的X.509证书包含以下数据:
(1)X.509版本号:
指出该证书使用了哪种版本的X.509标准,版本号会影响证书中的一些特定信息。
目前的版本是
3。
"
(2)证书持有人的公钥:
包括证书持有人的公钥,算法(指明密钥属于哪种密码系统)的标示符和其他相关的密钥参数。
(3)证书的序列号:
创建证书的实体(组织或个人)有责任为该证书指定一个独一无二的序列号,以区别于该实体发布的其他证书。
序列号信息有许多用途;
比如当一份证书被回收以后,它的序列号就被放入证书回收列表(CRL)之中。
(4)证书持有人唯一的标示符:
DN由许多部分组成,看起来象这样:
CN=BobAllen,OU=TotalNetworkSecurityDivision,
O=NetworkAssociates,Inc.,C=US
这些信息指出该科目的通用名,组织单位,组织和国家
(5)证书的有效期:
证书起始日期和时间以及终止日期和时间;
指明证书何时失效。
(6)证书发布者的唯一名字:
这是签发该证书的实体的唯一名字。
通常是CA。
.使用该证书意味着信任签发证书的实体。
(注意:
在某些情况下,比如根或顶级CA证书,发布者自己签发证书)
(7)发布者的数字签名:
这是使用发布者私钥生成的签名。
(8)签名算法的标示符:
指明CA签署证书所使用的算法。
X.509证书和PGP证书之间有许多不同,最明显的如下所述:
(1)用户可以创建自己的PGP证书,但是必须向CA请求才能得到一份X.509证书。
(2)X.509证书天生只支持密钥拥有者的一个名字。
(3)X.509证书只支持证明密钥合法性的一个数字签名。
要获得一份X.509证书,必须请求CA发给你证书。
用户提供自己的公钥,证明自己拥有相应的私钥,并提供有关自己的某些特定信息。
然后在这些信息上数字签名,并将整个数据包(称为证书请求)发给CA。
CA做一些努力来验证用户提供的信息是正确的,然后就生成证书并返回给用户。
【OpenSSL对X509的支持】
以下是我自己对OpenSSL的理解,可以表达上不是很准确。
(1)证书请求管理
(2)证书生成
(3)证书吊销及CRL管理
(4)X509名字管理
(5)属性管理
(6)扩展管理
(7)验证及信任管理
在随后的一些篇幅中将对以上的这几个方面进行展开说明。
OpenSSL之X509系列之2---证书请求管理
【数据结构】
证书请求用到了两个重要的数据结构:
证书请求信息结构X509_REQ_INFO与证书请求结构X509_REQ,二者的定义如下:
typedefstructX509_req_info_st{ASN1_ENCODINGenc;
ASN1_INTEGER*version;
X509_NAME*subject;
X509_PUBKEY*pubkey;
/*d=2hl=2l=0cons:
cont:
00*/
STACK_OF(X509_ATTRIBUTE)*attributes;
/*[0]*/
}X509_REQ_INFO;
其中version就是版本号、subject就是主题(常用的是dn)、pubkey是事先生成的公钥、attributes是一系列的属性,用于表达证书主题的额外信息,细节参见PKCS#10与PKCS#
9。
typedefstructX509_req_st{X509_REQ_INFO*req_info;
X509_ALGOR*sig_alg;
ASN1_BIT_STRING*signature;
intreferences;
}X509_REQ;
其中req_info就是上面所说的证书请求信息、sig_alg是签名使用的算法比如md5WithRSAEncryption、signature就是签名值了。
【基本操作函数概述】
这些基本的操作函数主要是对证书请求项进行设置与读取操作,它的的定义如下:
其中的X509_REQ*req对数指的是要操作的X509_REQ对象,下面不再赘述。
intX509_REQ_set_version(X509_REQ*x,longversion);
intX509_REQ_set_subject_name(X509_REQ*req,X509_NAME*name);
intX509_REQ_set_pubkey(X509_REQ*x,EVP_PKEY*pkey);
EVP_PKEY*X509_REQ_get_pubkey(X509_REQ*req);
X509_REQ_extract_key(a)
intX509_REQ_verify(X509_REQ*a,EVP_PKEY*r);
intX509_REQ_sign(X509_REQ*x,EVP_PKEY*pkey,constEVP_MD*md);
【X509_REQ_set_version】
设置版本号,version就是版本号。
【X509_REQ_set_subject_name】
该函数设置证书请求人的主题名,X509_NAME*name参数就是要设置的主题名。
对于名字的操作到时会有一个专题来讲。
【X509_REQ_set_pubkey】
设置公钥,EVP_PKEY*pkey参数就是生成好的公钥,可以通过RSA_generate_key()来生成。
比如:
EVP_PKEY*pNewRsaKey;
intGenerateRSAKeyPair(char*szKeyLength){if(strlen(szKeyLength)==0)return-1;
intkeylength=atoi(szKeyLength);
if((pNewRsaKey=EVP_PKEY_new())==NULL)returnCA_FAIL;
intret=EVP_PKEY_assign_RSA(pNewRsaKey,RSA_generate_key(keylength,0x10001,
NULL,//req_cb
NULL));
//cbargs
if(ret!
=1)returnCA_FAIL;
returnCA_OK;
}
【X509_REQ_get_pubkey】
读取X509_REQ中的公钥信息,返回的是一个EVP_PKEY对象,X509_REQ_extract_key()是它的一个宏定义,功能相同。
【X509_REQ_sign】
对X509_REQ中X509_REQ_INFO结构用pkey与md进行签名,并用算法标识与签名值填充X509_REQ中的sig_alg与signature域。
【X509_REQ_verify】
与签名相对应,对签名进行验证,所以将公钥pkey传入就可以了。
OpenSSL之X509系列之3---证书请求的IO函数
【输入输出函数】
这些函数有两类:
一类是将X509_REQ信息在文件或BIO抽象层上输入输出,另一类是在控制台上将X509_REQ信息进行显示。
它们的函数定义如下:
X509_REQ*d2i_X509_REQ_fp(FILE*fp,X509_REQ**req);
inti2d_X509_REQ_fp(FILE*fp,X509_REQ*req);
X509_REQ*d2i_X509_REQ_bio(BIO*bp,X509_REQ**req);
inti2d_X509_REQ_bio(BIO*bp,X509_REQ*req);
intX509_REQ_print_ex(BIO*bp,X509_REQ*x,unsignedlongnmflag,unsignedlongcflag);
intX509_REQ_print(BIO*bp,X509_REQ*req);
intX509_REQ_print_fp(FILE*fp,X509_REQ*x)
【d2i_X509_REQ_fp】
将证书请求从文件中读入并转化成X509_REQ内部结构。
【i2d_X509_REQ_fp】
将X509_REQ对象进行DER编码输出,并写入fp指定的文件中。
【d2i_X509_REQ_bio】
功能与d2i_X509_REQ_fp相同,只是读的时候从BIO抽象层上读,你可以将它与文件相关联就可以了。
【i2d_X509_REQ_bio】
功能与i2d_X509_REQ_fp相同,只是写的时候从BIO抽象层上写,你可以将它与文件或者内存BIO相关联就可以输出了。
【X509_REQ_print】
将X509_REQ在BIO上输出,但输入是可以读的,比如Subject=XXX等。
其实底层就是调用X509_REQ_print_ex来实现的。
【X509_REQ_print_ex】
这个函数与X509_REQ_print的区别是可以用标志去控制输出,nmflags用于控制显示方式,cflag用于控制哪些不显示,可以按自己的需要进行定制。
它们的定义在x
509."
h里。
具体如下:
#defineX509_FLAG_COMPAT0
#defineX509_FLAG_NO_HEADER1L
#defineX509_FLAG_NO_VERSION(1L<
<
1)
#defineX509_FLAG_NO_SERIAL(1L<
2)
#defineX509_FLAG_NO_SIGNAME(1L<
3)
#defineX509_FLAG_NO_ISSUER(1L<
4)
#defineX509_FLAG_NO_VALIDITY(1L<
5)
#defineX509_FLAG_NO_SUBJECT(1L<
6)
#defineX509_FLAG_NO_PUBKEY(1L<
7)
#defineX509_FLAG_NO_EXTENSIONS(1L<
8)
#defineX509_FLAG_NO_SIGDUMP(1L<
9)
#defineX509_FLAG_NO_AUX(1L<
10)
#defineX509_FLAG_NO_ATTRIBUTES(1L<
11)
【X509_REQ_print_fp】
其实这个函数就是将可读的结果保存在文件里,内存就是生成一个BIO对象BIO_new(BIO_s_file(),然后再将文件句柄传给他BIO_set_fp(b,fp,BIO_NOCLOSE),再调用X509_REQ_print函数进行输出。
这几个print函数,具体实现在crypto/asn1/t_req.c中。
OpenSSL之X509系列之4---证书请求的扩展项操作
【扩展项操作函数】
这些函数主要是对证书的请求的扩展项进行读取与设置操作,
intX509_REQ_extension_nid(intnid);
int*X509_REQ_get_extension_nids(void);
voidX509_REQ_set_extension_nids(int*nids);
STACK_OF(X509_EXTENSION)*X509_REQ_get_extensions(X509_REQ*req);
intX509_REQ_add_extensions_nid(X509_REQ*req,STACK_OF(X509_EXTENSION)*exts,intnid);
intX509_REQ_add_extensions(X509_REQ*req,STACK_OF(X509_EXTENSION)*exts);
【X509_REQ_extension_nid】
判断nid是否已经在内部nid_list列表中定义了。
未定义返回0,否则返回
1。
【X509_REQ_get_extension_nids】
返回已经定义的nid列表。
【X509_REQ_set_extension_nids】
设置定义好的nid列表。
【X509_REQ_get_extensions】
取出证书请求中的扩展项,过程是这样的,先从属性中将经过der编码的扩展项取出来,然后调用d2i_ASN1_SET_OF_X509_EXTENSION函数,将它转化成内部结构。
【X509_REQ_add_extensions】
将定义好,且赋了值的X509_EXTENSION扩展项加入证书请求中(其实是加到属性中,这在以后讲)。
【X509_REQ_add_extensions_nid】
功能与X509_REQ_add_extensions相同,只不过nid参数可以使用非标准的nid,其实X509_REQ_add_extensions就是通过调用这个函数是实现的,只不过使用了objects.h中定义的ExtensionRequest标准定义。
#defineNID_ext_req172
OpenSSL之X509系列之5---证书请求的其它相关操作
【相关操作函数】
X509_REQ*X509_to_X509_REQ(X509*x,EVP_PKEY*pkey,constEVP_MD*md);
X509*X509_REQ_to_X509(X509_REQ*r,intdays,EVP_PKEY*pkey);
intX509_REQ_digest(constX509_REQ*data,constEVP_MD*type,unsignedchar*md,unsignedint*len);
X509_REQ*X509_REQ_dup(X509_REQ*req);
【X509_to_X509_REQ】
用X509证书结构直接生成一个证书请求结构,其中x就是证书结构,pkey是公钥,md是散列算法,操作的过程就是将证书里的主题名与公钥填充到X509_REQ证书请求结构中,然后用指定的pkey与md进行签名,成功返回X509_REQ证书请求结构。
【X509_REQ_to_X509】
从证书请求结构直接生成一个X509证书,其中的day就是证书的有效期(多少天),pkey就是用于签名的私钥。
操作过程:
从证书请求结构取出主题,将它填充到X509的主题与签发者中,取出公钥填充到X509公钥域里,有MD5与私钥进行签名,所以这样生成证书应用是一张自签名的证书。
【X509_REQ_digest】
将X509_REQ用指定的散列算法type进行散列。
结果在md中,len是结果的长度。
【X509_REQ_dup】
复制一份X509_REQ结构。
它是宏定义,实际上是由ASN1_dup函数来完成复制工作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenSSL X509 系列