我刚刚写完了一些OpenSSL / PKCS7数字签名代码,现在有一个工作的PEM编码的PKCS7文件。因此,经过一场小小的战斗,我需要将该PEM转换为DER格式。事实证明这比我希望的更难。
OpenSSL中有一些便捷方法,例如“PEM_write_bio_PKCS7_stream”来编写PKCS7对象。但经过一些广泛的谷歌搜索和浏览一些头文件后,我似乎无法找到任何东西来获取PKCS7对象并以DER格式将其写入任何内容(BIO,FILE,char *)。
所以感觉在那里失败了,我转向解析标题&页脚在PEM文件和Base64解码内容。作为检查,我用Java& BouncyCastle并且得到了我想要的东西。
这是我的代码。几乎每个Base64解码器我试着转过这样的东西......
MIIHmwYJKoZIhvcNAQcCoIIHjDCCB4gCAQExCzAJBgUrDgMCGgUAMIIBrQYJKoZI
hvcNAQc ... Lots More stuff
... +8L5ad45D/7ZGJWafaSw==
...成
0\202\233 *\367\367
\240\202\2140\202\21010 +
这是代码......
string PKCS7String(starting_point);
string PEM_PKCS7_HEADER("-----BEGIN PKCS7-----\n");
string PEM_PKCS7_FOOTER("\n-----END PKCS7-----");
string::size_type pos = 0;
while ( (pos = PKCS7String.find(PEM_PKCS7_HEADER, pos)) != string::npos ) {
PKCS7String.replace( pos, PEM_PKCS7_HEADER.length(), "" );
pos++;
}
pos = 0;
while ( (pos = PKCS7String.find(PEM_PKCS7_FOOTER, pos)) != string::npos ) {
PKCS7String.replace( pos, PEM_PKCS7_FOOTER.length(), "" );
pos++;
}
//Take your pick of decoders, they all do the same thing. Here's just the most recent
auto_ptr< uint8_t > decoded = decode(PKCS7String);
uint8_t* array = decoded.get();
cout << array << endl;
有什么想法吗?
答案 0 :(得分:3)
PEM文件只是DER文件的Base64编码版本,-----BEGIN PKCS7-----
&amp; -----END PKCS7-----
页眉和页脚行。
所以不确定在Base64解码后你期望看到什么......
仅作为测试:
以PKCS#7 PEM格式打包证书:$ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem
以PKCS#7 DER格式打包相同的证书:$ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der
Base64使用您选择的解码器解码PEM文件(outfile.pem.p7b
)的主体。将二进制输出与DER文件(outfile.der.p7b
)
现在,我担心这可能是你要求的,但不是你想要的......
答案 1 :(得分:0)
i2d_PKCS7_fp()
的 i2d_PKCS7_bio()
和<openssl/pkcs7.h>
会将DER格式的PKCS7
结构分别写入文件流或BIO。