根据您的意见,我假设的证书是DER格式,它可以转换为PEM与openssl x509
命令(见:openssl x509 command):
openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem
之后,您可以指示Ruby的OpenSSL库使用受信任的根证书对这样的事情SSL连接进行验证:
require 'socket'
require 'openssl'
tcp_sock = TCPSocket.new("my.host.tld", 443)
ctx = OpenSSL::SSL::SSLContext.new
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
#You may need to specify the absolute path to the file
ctx.ca_file = "certfile.pem"
ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx)
ssl_sock.sync_close = true
ssl_sock.connect
begin
ssl_sock.post_connection_check('my.host.tld')
rescue
puts "Certificate host did not match expected hostname"
end
之后,你应该能够读取和写入ssl_sock
像任何其他Ruby的IO对象。创建ssl_sock
之前
ctx.cert = OpenSSL::X509::Certificate.new(File.read("my_cert.pem"))
ctx.key = OpenSSL::PKey::RSA.new(File.read("my_key.rsa"))
:如果您将得到使用,以使服务器验证您客户端证书,你可以配置SSL环境。 OpenSSL库还支持除了RSA等重点类型,如DSA(参见:OpenSSL::PKey module)
最后,最后一条建议,如果你正在访问一个RESTful API,你可能要考虑使用的宝石一样rest-client而不是直接处理所有的HTTP/S连接。当然,这样的图书馆是否合适或有用取决于您使用的服务。
为了澄清,您链接的mathish.com文章实际上与jRuby没有任何关系。我演示的代码必须与基于Java的ActiveMQ消息代理交谈,并使用Java的SSL证书约定。该代码中的大部分注释提醒我如何将Java的SSL证书从密钥库中取出,并转换为OpenSSL可以识别的格式。 –
如果你在文本编辑器中打开.cer文件,它们是以“----- BEGIN CERTIFICATE -----”还是别的什么开头的? –
嘿@ian,谢谢澄清。他们不以'----- BEGIN CERTIFICATE -----'开头;没有。用文本编辑器打开它;它看起来像内容以某种方式加密(只是随机一堆的ASCII符号和空格等,没有可读的字母)。 – jkale