Rails中OpenSSL解析PKCS12证书报错PKCS12_parse: unsupported
Ruby OpenSSL无法解析PKCS12证书,但终端openssl命令可正常读取的问题
我通过HTTParty使用p12证书文件和密码连接主机,该gem内部调用OpenSSL::PKCS12.new(p12_file_content, 'password')。在Rails控制台测试时执行以下代码:
p12_file_content = File.read("#{Rails.root}/config/certs/#{Rails.env}_client_certificate.p12") => "0\x82\e\xF1\u0002" ....... OpenSSL::PKCS12.new(p12_file_content, 'myfakepassword')
执行后出现错误:
`initialize': PKCS12_parse: unsupported (OpenSSL::PKCS12::PKCS12Error)
但在终端执行openssl pkcs12 -info -in development_client_certificate.p12 -nodes并输入密码后可正常读取证书。我有其他证书可正常使用OpenSSL::PKCS12.new,且已多次确认密码正确。
版本信息
irb(main):016:0> OpenSSL::VERSION => "3.0.1"
ruby -v ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [arm64-darwin22] openssl version OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
Ruby 3.1.4使用的是3.0.1版本的OpenSSL gem,请问为何Ruby的OpenSSL无法解析该证书?
可能的原因及解决方向
- OpenSSL版本差异:Ruby绑定的OpenSSL gem版本(3.0.1)低于系统终端使用的OpenSSL版本(3.0.8)。该PKCS12证书可能使用了3.0.1不支持的加密算法、密钥派生函数或格式特性,而3.0.8版本已修复兼容这类特性。
- 文件读取模式错误:
File.read默认按文本模式读取二进制格式的p12证书,可能因编码转换破坏证书内容。应改用二进制模式读取:p12_file_content = File.binread("#{Rails.root}/config/certs/#{Rails.env}_client_certificate.p12") - 证书兼容性问题:部分PKCS12证书可能使用了旧版加密标准或包含Ruby OpenSSL未正确处理的扩展字段。可尝试用系统的OpenSSL重新导出证书,指定兼容参数:
之后使用新生成的证书测试。openssl pkcs12 -in development_client_certificate.p12 -out temp.pem -nodes openssl pkcs12 -export -in temp.pem -out new_development_certificate.p12 -legacy
内容的提问来源于stack exchange,提问作者Frexuz
相关产品推荐
相关产品推荐

