Ruby中使用OpenSSL::PKCS7加解密及解密报错问题求助
Ruby 中 OpenSSL::PKCS7 解密失败的解决办法
你这段代码的问题出在自签名证书缺少必要的标识字段——没有设置subject和issuer,导致PKCS7加密生成的密文无法和私钥正确关联,最终触发decrypt error。
修正后的完整代码如下:
require 'openssl' # 创建密钥与完整的自签名证书 key = OpenSSL::PKey::RSA.new 1024 cert = OpenSSL::X509::Certificate.new cert.version = 2 cert.serial = 1 # 设置证书主体与颁发者(自签名证书两者一致) cert.subject = OpenSSL::X509::Name.parse "/CN=Test Cert" cert.issuer = cert.subject cert.public_key = key.public_key cert.not_before = Time.now cert.not_after = Time.now + 2**12 cert.sign key, OpenSSL::Digest.new('SHA256') # 加密操作 ciphertext = OpenSSL::PKCS7.encrypt([cert], "plaintext").to_pem # 解密操作 pkcs7 = OpenSSL::PKCS7.new(ciphertext) # 使用X509证书存储来匹配证书,也可以直接传入证书数组 store = OpenSSL::X509::Store.new store.add_cert(cert) decrypted = pkcs7.decrypt(key, store) puts decrypted # 输出: plaintext
关键说明:
- 证书必须包含
subject和issuer:PKCS7加密时会基于这些标识生成收件人信息,解密时需要通过这些信息找到对应的私钥匹配项,缺失则无法完成解密。 - 解密时的第二个参数:官方推荐使用
OpenSSL::X509::Store,它能更可靠地管理证书;你也可以直接传入[cert]作为替代,但证书存储在复杂场景下兼容性更好。 - Ruby 2.6.x版本的OpenSSL绑定对证书完整性要求严格,缺少核心字段会直接导致加解密流程失败。
内容的提问来源于stack exchange,提问作者Jellicle
相关产品推荐
相关产品推荐

