i2d_X509_REQ_INFO无法正确转换req_info结构

i2d_X509_REQ_INFO doesn't convert req_info structure properly

本文关键字:转换 req info 结构 X509 REQ INFO i2d      更新时间:2023-10-16

我们正在研究令牌来生成CSR(证书签名请求(。密钥对在令牌中完美生成,但我们无法获得适当的 CSR。 我正在尝试使用 PKCS11 接口创建在智能卡内签名的 X509 证书请求。我正在使用openssl-1.0.2。

要执行此任务,我必须执行以下步骤: 1、创建证书请求(X509_new( 2、加载公钥(X509_REQ_set_pubkey( 3、根据需要设置主题名称和扩展名 4、出口req_info结构(i2d_X509_REQ_INFO( 5、使用 PKCS11 对此结构进行签名

不幸的是,创建的请求不包含有效的签名。在仔细查看 openssl 调用后,我注意到使用i2d_X509_REQ_INFO函数导出的缓冲区不包含正确编码的结构。 有人可以帮助我,我做错了什么,或者我忘记初始化结构的哪个参数吗?

Relevant part of the code:
...
X509_REQ *req;
X509_NAME *subj;
if (!(req = X509_REQ_new())) {
printf("Unable to initialize X509_REQ structuren");
return -1;
}
RSA *rsa;
rsa = RSA_new();
rsa->e = BN_bin2bn( (unsigned char *) pub_publicExponent, (int) 3, NULL );
rsa->n = BN_bin2bn( (unsigned char *) modulus, (int) (pub_modulusbits/8), NULL );
if( (pkey = EVP_PKEY_new()) == NULL ) {
printf("Unable to initialize PKEY structuren");
return -1;
}
EVP_PKEY_assign_RSA( pkey , rsa );
X509_REQ_set_pubkey(req, pkey);
subj=X509_REQ_get_subject_name(req);
X509_NAME_add_entry_by_txt(subj,"C",
MBSTRING_ASC, (unsigned char *)"SK", -1, -1, 0);
X509_NAME_add_entry_by_txt(subj,"CN",
MBSTRING_ASC, (unsigned char *)"Test", -1, -1, 0);
int datasig_len;
unsigned char *tobesigned;
datasig_len = i2d_X509_REQ_INFO( req->req_info, NULL );
tobesigned = (unsigned char *) malloc( datasig_len );
if( !tobesigned ) {
printf("Unable to alloc mem buffern");
return -1;
}
int zzz = i2d_X509_REQ_INFO( req->req_info, &tobesigned );

您似乎忽略了相关文档的一部分(诚然,这很容易发生(:

i2d_X509(( 将 x 指向的结构编码为 DER 格式。如果 out 不是 NULL 是将 DER 编码数据写入缓冲区 *out,并将其递增到刚写入的数据之后。如果返回 值为负,发生错误,否则返回长度 的编码数据。

(请注意,此代码段以i2d_X509()为例,但它对i2d_X509_REQ_INFO()的工作方式相同(

在调用i2d函数之前,您必须存储tobesigned的值,以便以后可以引用它。

重新创建您的示例,它似乎确实包含您的结构的有效 DER 格式表示,因为它似乎朝着相反的方向发展而没有问题。以下代码片段对此进行了说明:

unsigned char *ptr = tobesigned;
int zzz = i2d_X509_REQ_INFO( req->req_info, &ptr );
const unsigned char *ptr2 = tobesigned;
X509_REQ_INFO *deser = d2i_X509_REQ_INFO(NULL, &ptr2, zzz);
printf("Result of i2d|d2i_X509_REQ_INFO: n"
"  zzz        = %dn"
"  tobesigned = 0x%pn"
"  ptr        = 0x%pn"
"  ptr2       = 0x%pn"
"  deser      = 0x%pn",
zzz, tobesigned, ptr, ptr2, deser);

它产生:

Result of i2d|d2i_X509_REQ_INFO: 
zzz        = 198
tobesigned = 0x0x7fd09c403010
ptr        = 0x0x7fd09c4030d6
ptr2       = 0x0x7fd09c4030d6
deser      = 0x0x7fd09c402f60