1

OpenSSL / PKCS7デジタル署名コードの記述が完了し、PEMでエンコードされたPKCS7ファイルが機能するようになりました。少しの戦いの後、私はそのPEMをDER形式に変換する必要があります。これは私が思っていたよりも難しいことを証明しています。

OpenSSLには、PKCS7オブジェクトを書き込むための「PEM_write_bio_PKCS7_stream」などの便利なメソッドがいくつかあります。しかし、いくつかの大規模なグーグルといくつかのヘッダーファイルを参照した後、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 ファイルは、DER ファイルを Base64 でエンコードしたバージョンで、ヘッダーとフッターの行が-----BEGIN PKCS7-----&です。 そのため、Base64 でデコードした後に何が表示されるかは正確にはわかりません...-----END PKCS7-----

テストとして:

  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. 選択したデコーダーを使用して PEM ファイルの本体を Base64 でデコードし ( outfile.pem.p7b)、バイナリ出力を DER ファイルと比較します ( outfile.der.p7b)

残念ながら、これはあなたが求めていたものかもしれませんが、あなたが望んでいたものではないかもしれません...

于 2011-01-05T03:45:24.440 に答える
1

i2d_PKCS7_fp()およびi2d_PKCS7_bio()fromは、構造体を DER 形式でファイル ストリームまたは BIO にそれぞれ<openssl/pkcs7.h>書き出します。PKCS7

于 2011-01-05T04:05:12.427 に答える