******************************************************************************************** 声明:本文档根据openssl源代码、SSLeay 文档以及其它相关材料写成,转载需经本站授权,商业用途不得转载.本人能力有限,如有问题欢迎交流与指正。本站也欢迎原创作者投搞。 作者:Rainbow(不经历风雨,怎么见彩虹) 网站: 论坛:/forum/forum.html 邮件:rainbow_zrh@sina.com webmaster@infosecurity.org.cn OpenSSL版本:openssl-0.9.7d 投搞时间:2004-8-1 **************************************************************************************/
【数据结构】 证书请求用到了两个重要的数据结构:证书请求信息结构X509_REQ_INFO与证书请求结构X509_REQ,二者的定义如下: typedef struct X509_req_info_st { ASN1_ENCODING enc; ASN1_INTEGER *version; X509_NAME *subject; X509_PUBKEY *pubkey; /* d=2 hl=2 l= 0 cons: cont: 00 */ STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ } X509_REQ_INFO; 其中version就是版本号、subject就是主题(常用的是dn)、pubkey是事先生成的公钥、attributes是一系列的属性,用于表达证书主题的额外信息,细节参见PKCS#10与PKCS#9。 typedef struct X509_req_st { X509_REQ_INFO *req_info; X509_ALGOR *sig_alg; ASN1_BIT_STRING *signature; int references; } X509_REQ; 其中req_info就是上面所说的证书请求信息、sig_alg是签名使用的算法比如md5WithRSAEncryption、signature就是签名值了。 【基本操作函数概述】 这些基本的操作函数主要是对证书请求项进行设置与读取操作,它的的定义如下:其中的X509_REQ* req对数指的是要操作的X509_REQ对象,下面不再赘述。 int X509_REQ_set_version(X509_REQ *x,long version); int X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name); int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); EVP_PKEY * X509_REQ_get_pubkey(X509_REQ *req); X509_REQ_extract_key(a) int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_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; int keylength=atoi(szKeyLength); if ((pNewRsaKey=EVP_PKEY_new()) == NULL) return CA_FAIL; int ret = EVP_PKEY_assign_RSA(pNewRsaKey,RSA_generate_key(keylength,0x10001, NULL, // req_cb NULL)); // cb args if(ret != 1) return CA_FAIL; return CA_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传入就可以了。
|