OpenSSL没有足够的数据

时间:2012-08-28 15:49:20

标签: ruby openssl digital-signature x509

我使用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文件正常工作......

我可以做些什么来完成这项工作?

2 个答案:

答案 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)

这是一种纯红宝石方式,没有任何外壳交互。