【数据结构】
证书请求用到了两个重要的数据结构:证书请求信息结构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传入就可以了。
阅读(4004) | 评论(0) | 转发(0) |