Ruby PKCS7: を追加しました「バイトが復号化を破壊しています
概要
Ruby の OpenSSL ライブラリを使用して、メッセージを PKCS7 として暗号化して署名しようとすると、余分な部分が発生することがわかりました。 文字が挿入され、メッセージを解読できません。
以下におもちゃの例を示します。より完全な例はこのペーストにあります。
# The sender encrypts the message
crypted = OpenSSL::PKCS7.encrypt([recipient_cert], "message").to_der
# The sender signs the message
signed = OpenSSL::PKCS7.sign(sender_cert, sender_key, crypted).to_der
# The recipient extracts data from the signed PKCS7
p7_signed = OpenSSL::PKCS7.new(signed)
store = OpenSSL::X509::Store.new
p7_signed.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY)
unsigned = p7_signed.data
# The tries to decrypt the data
OpenSSL::PKCS7.new(unsigned).decrypt(recipient_key, recipient_cert)
# => ArgumentError: Could not parse the PKCS7: nested asn1 error
これについてはどうすればよいでしょうか?p7_signed から抽出されたデータが crypted のデータと一致しないのはなぜですか? 2 つを調べてみると、署名されていない部分にはいくつかの内容が含まれていることがわかりました。 暗号化されていない文字があちこちにあります。
(CRLF と LF の問題が生じた場合に備えて、私は Linux でこれを行っています。)
解決策
PKCS7_BINARY フラグを PKCS7.sign() に指定する必要があります。おそらく OpenSSL::PKCS7::BINARY として利用可能です。私は Ruby のことはまったく知りませんが、ruby-doc.org のドキュメントと openssl のマニュアル ページを読むと、これが問題だと思います。
PKCS7 の openssl man ページから (私による若干の修正あり):
OpenSSL::PKCS7.sign(…) への入力は OpenSSL::PKCS7.encrypt(…) からの DER エンコードされた出力であるため、これは本質的にテキストではなくバイナリ形式です。