2011-11-01 19 views
22
的最新版本

考慮下面的代碼使用無效證書連接到HTTPS服務器:如何使用Ruby

require 'net/https' 
uri = URI.parse("https://host/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

其中https://host/index.html是在服務器上的無效證書的有效地址。

在舊版本的紅寶石(特別是1.8.7-P334和1.9.2-P180)這種代碼工作正常。在所有最新版本(1.8.7-P352,1.9.2-P290和1.9.3-P0)它拋出以下異常:

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=unknown state 

在最後一行。

更改verify_mode到OpenSSL::SSL::VERIFY_PEER給出完全錯誤表明它正試圖驗證證書,儘管設置的。

我怎樣才能說服紅寶石忽略無效的證書和連接?

回答

19
uri = URI("https://host/index.html") 
req = Net::HTTP::Get.new(uri.path) 

res = Net::HTTP.start(
     uri.host, uri.port, 
     :use_ssl => uri.scheme == 'https', 
     :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |https| 
    https.request(req) 
end 
+0

使用',而不是有固定的問題對我來說太驗證模式屬性'#post_form'#start'。似乎很奇怪......感謝您的建議。 –

+0

爲什麼你必須使用start方法? – jspooner

+1

我不得不添加'要求 「淨/ HTTPS」',只有'之前需要 「網/ HTTP」' – botchniaque

9
require 'nokogiri' 
require 'open-uri' 
require 'net/https' 

@doc = Nokogiri::HTML(open(my_url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)) 
+0

在紅寶石2.2.2'開放(my_url,:ssl_verify_mode => OpenSSL的:: SSL :: VERIFY_NONE)'是足夠 – mrt