i2d_X509_REQ_INFO无法正确转换req_info结构
i2d_X509_REQ_INFO doesn't convert req_info structure properly
我们正在研究令牌来生成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
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()