我使用Adobe X生成了自签名证书,并导出了一个pfx文件(用于我的私钥)以及一个.cer文件(用于证书)。
然后我尝试收集证书以及密钥,但出于某种原因,OpenSSL正在提供错误
OpenSSL::X509::CertificateError: not enough data
这是我的代码
require 'openssl'
CERTFILE = "test.cer"
RSAKEYFILE = "test.pfx"
# Open certificate files
cert = OpenSSL::X509::Certificate.new(File.read CERTFILE)
key = OpenSSL::PKey::RSA.new(File.read RSAKEYFILE )
我的证书是使用Adobe X阅读器生成的,是一个自签名证书。签署pdf文件正常工作......
我可以做些什么来完成这项工作?
答案 0 :(得分:4)
显然,OpenSSL在直接从.cer文件中读取时存在一些问题,对于密钥,我们应该只使用private_key,而pfx同时具有私钥和证书。
所以,我在本地安装了openSsl,并使用以下命令首先将converted我的.cer证书安装到.pem:
C:\OpenSSL-Win32\bin>openssl x509 -inform der -in "c:\mydir\test.cer" -out "C:\mydir\certificate.pem"
然后从pfx文件中提取我的私钥(基于this网站):
C:\OpenSSL-Win32\bin>openssl pkcs12 -in "c:\mydir\test.pfx" -nocerts -out "c:\mydir\test_pk.pem"
确保您拥有pfx密码并在提取私钥时选择密码。
以下是最终代码:
require 'openssl'
CERTFILE = "certificate.pem"
RSAKEYFILE = "test_pk.pem"
passphrase = "your chosen passphrase for the private key"
key4pem=File.read RSAKEYFILE
# Open certificate files
cert = OpenSSL::X509::Certificate.new(File.read CERTFILE)
key = OpenSSL::PKey::RSA.new key4pem, passphrase
并且voilá:-),我们已成功将我们的证书和私钥映射到内存中,并且可以将其用于回答here
答案 1 :(得分:2)
当尝试从'.cer'创建OpenSSL::X509::Certificate对象时,我发现此错误:
OpenSSL::X509::CertificateError (not enough data)
我检查了文件实际上是一个DER-encoded certificate
,它是二进制格式。在这种情况下,我们应该通过 File.binread 读取文件内容。
要检查文件是PEM还是DER编码?我们可以使用以下代码:
require "open3"
require "openssl"
def pem_cert?(file)
details, status = Open3.capture2e("file", file)
return false unless status.success?
details.rpartition(":").last.strip == "PEM certificate"
end
contents = if pem_cert?(cer_file_path)
File.read(cer_file_path)
else
File.binread(cer_file_path)
end
OpenSSL::X509::Certificate.new(contents)
这是一种纯红宝石方式,没有任何外壳交互。