c++ - i2d_X509_REQ_INFO 不能正确转换 req_info 结构
问题描述
我们正在研究生成 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 structure\n");
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 structure\n");
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 buffer\n");
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 = %d\n"
" tobesigned = 0x%p\n"
" ptr = 0x%p\n"
" ptr2 = 0x%p\n"
" deser = 0x%p\n",
zzz, tobesigned, ptr, ptr2, deser);
它产生:
Result of i2d|d2i_X509_REQ_INFO:
zzz = 198
tobesigned = 0x0x7fd09c403010
ptr = 0x0x7fd09c4030d6
ptr2 = 0x0x7fd09c4030d6
deser = 0x0x7fd09c402f60
推荐阅读
- c - 如何使用 -Wstringop-overread 处理特殊指针
- database - 如何同步到 MS Access 中的表?
- python-3.x - 引发不同异常的函数的单元测试
- c - Kernighan 和 Ritchie 练习 3.4
- user-interface - 如何从两列数据制作一个 Power BI 饼图小部件/或将两个饼图合并为一个
- c# - 如何计算两个波斯日期之间的总天数(以 yyyy/MM 格式)?
- python - 为什么`0--3//2`和`--3//2`之间有区别?
- c# - 我的项目中没有“添加参考”
- typeorm - TypeORM:findOne 在关系上应用了“关系”和“where”条件 - EntityColumnNotFound:未找到实体列
- php - Codeigniter4 显示即使我使用了“set”方法,在运行更新查询时也必须使用“set”方法