根據您的意見,我假設的證書是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