如何使Ruby读取.cer public ssl key?

时间:2009-12-16 13:40:22

标签: ruby-on-rails encryption openssl

我正在开发一个需要电子支付模块的RoR网站。电子支付实现要求使用由它们提供的公共ssl密钥对xml数据进行编码。

我在Ruby中尝试做的事情:

public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file))

如果我只是尝试单独打开文件,它可以正常工作。但RSA.new()方法返回以下错误:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key:: nested asn1 error
    from (irb):5:in `initialize'
    from (irb):5:in `new'
    from (irb):5

根据我在在线文档中看到的,使用了.pem文件但我的公钥类似于public.cer。这可能是问题吗? 在电子支付公司提供的PHP示例中,密钥本身似乎没问题,同样的public.cer文件也能正常工作。

我做错了什么?

谢谢,

4 个答案:

答案 0 :(得分:8)

.cer文件很可能是在DER中编码的X.509证书。不幸的是,Ruby没有公开OpenSSL接口来读取DER中的证书。所以你需要先将DER转换为PEM。这在Ruby中相当容易,

b64 = Base64.encode64(File::read(cert_file))
pem = "-----BEGIN CERTIFICATE-----\n#{b64}-----END CERTIFICATE-----\n"
cert = OpenSSL::X509::Certificate.new(pem)
public_key = cert.public_key

答案 1 :(得分:2)

只是一个更新 - 当前用于ruby 1.9.3的openssl gem支持从DER PEM格式中读取文件中的证书。

cert = OpenSSL::X509::Certificate.new('certificate.pem')
cert = OpenSSL::X509::Certificate.new('certificate.cer')

请参阅http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/X509/Certificate.html上的文档。

答案 2 :(得分:0)

您可以在此处找到有关证书的不同编码的信息:http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/

尝试将证书从格式转换为pem。

openssl x509 –in input.crt –inform DER –out output.pem

答案 3 :(得分:0)

尝试将File.read替换为File.binread

根据您的平台(Windows最容易受到影响)File.read可能无法返回您所期望的内容。使用File.binread将确保您获得正在阅读并希望使用的二进制证书的实际二进制数据。

差异的一些背景:https://stackoverflow.com/a/30081354/252627