使用Ruby的OpenSSL库,当我尝试将消息加密和签名为PKCS7时,我发现插入了一些额外的\r
字符,并且我无法解密消息。
下面我举一个玩具的例子。更详细的例子可以在this paste上找到。
# 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
中的数据不匹配?当我检查这两者时,我发现unsigned
在这里和那里包含一些\r
字符,而crypted
没有。我该怎么办?
(我在Linux上这样做,以防出现CRLF与LF的问题。)
1条答案
按热度按时间wwodge7n1#
您应该将
PKCS7_BINARY
标志提供给PKCS7.sign(),可能以OpenSSL::PKCS7::BINARY
的形式提供。我根本不了解Ruby,但是阅读docs at ruby-doc.org和openssl man pages让我相信这就是问题所在。来自PKCS 7的openssl手册页(我做了一个小的修改):
通常,提供的内容会被转换成MIME规范格式(S/MIME规范要求),但如果设置了PKCS7_BINARY,则不会发生转换。如果提供的数据是二进制格式,则应使用此选项,否则转换将损坏它。
由于
OpenSSL::PKCS7.sign(...)
的输入是OpenSSL::PKCS7.encrypt(...)
的DER编码输出,因此它本质上是一种二进制格式,而不是文本。