You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:31:15