我正在开发一个需要电子支付模块的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文件也能正常工作。
我做错了什么?
谢谢,
答案 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
将确保您获得正在阅读并希望使用的二进制证书的实际二进制数据。