Chinaunix首页 | 论坛 | 博客
  • 博客访问: 730788
  • 博文数量: 140
  • 博客积分: 5097
  • 博客等级: 大校
  • 技术积分: 991
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-05 19:13
文章分类

全部博文(140)

文章存档

2018年(1)

2015年(5)

2014年(5)

2013年(2)

2011年(16)

2010年(6)

2009年(9)

2008年(45)

2007年(26)

2006年(25)

分类: 网络与安全

2008-05-10 20:34:31

【数据结构】
    证书请求用到了两个重要的数据结构:证书请求信息结构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) |
给主人留下些什么吧!~~