1

我刚刚完成了一些 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;

有什么想法吗?

4

2 回答 2

3

PEM 文件只是带有-----BEGIN PKCS7-----&-----END PKCS7-----页眉和页脚行的 DER 文件的 Base64 编码版本。
所以不完全确定你在 Base64 解码后会看到什么......

作为一个测试:

  1. 以 PKCS#7 PEM 格式打包证书:$ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem

  2. 以 PKCS#7 DER 格式打包相同的证书:$ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der

  3. Base64 使用您选择的解码器对 PEM 文件 ( outfile.pem.p7b) 的主体进行解码,并将二进制输出与 DER 文件 ( outfile.der.p7b)进行比较

现在,恐怕这可能是您要求的,但不是您想要的...

于 2011-01-05T03:45:24.440 回答
1

i2d_PKCS7_fp()i2d_PKCS7_bio()from<openssl/pkcs7.h>将分别以 DER 格式将结构写入PKCS7文件流或 BIO。

于 2011-01-05T04:05:12.427 回答