2011-11-02 119 views
6

我正在爲需要與API進行SSL連接的客戶端開發應用程序。我已經提供了三個文件;信任根證書(.cer)文件,中間證書(.cer)文件和已簽名的響應文件。我已經給出的安裝指令與IIS或Java keytool程序相關;我在Ruby on Rails中構建應用程序,因此這兩者都不是一個選項(據我所知)。在Ruby on Rails應用程序中使用客戶端SSL

證書由運行API服務的組織自簽名,看起來我獲得了客戶端證書以相互驗證https連接。我不能確定如何

  1. 使用我的應用程序的證書連接和使用API​​
  2. 的簽名響應文件做什麼

我讀過"Using a self-signed certificate"this article on OpenSSL in Ruby但既不似乎相當受歡迎(並且都對Java/JRuby有一定的依賴性,這會使事情混淆)。

任何指針將不勝感激。

+0

爲了澄清,您鏈接的mathish.com文章實際上與jRuby沒有任何關係。我演示的代碼必須與基於Java的ActiveMQ消息代理交談,並使用Java的SSL證書約定。該代碼中的大部分註釋提醒我如何將Java的SSL證書從密鑰庫中取出,並轉換爲OpenSSL可以識別的格式。 –

+0

如果你在文本編輯器中打開.cer文件,它們是以「----- BEGIN CERTIFICATE -----」還是別的什麼開頭的? –

+0

嘿@ian,謝謝澄清。他們不以'----- BEGIN CERTIFICATE -----'開頭;沒有。用文本編輯器打開它;它看起來像內容以某種方式加密(只是隨機一堆的ASCII符號和空格等,沒有可讀的字母)。 – jkale

回答

4

根據您的意見,我假設的證書是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連接。當然,這樣的圖書館是否合適或有用取決於您使用的服務。

+0

只是想說明,與'SSLContext'對象'ca_file'屬性不同,'cert'和'key'需要實際的文件數據,而不僅僅是文件名。 –

+0

如果您不關心驗證證書上的名稱,您也不必執行'post_connection_check'和周圍的'begin ... rescue'塊。 –

+0

大代碼塊的第4行應該是'tcp_sock'而不是'sock' – SnareChops