如何使用最新版本的Ruby连接到具有无效证书的https服务器

Jon*_*han 27 ruby ssl

请考虑以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

其中https://host/index.html是服务器上的证书无效的有效地址.

在旧版本的ruby(特别是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
Run Code Online (Sandbox Code Playgroud)

在最后一行.

更改verify_mode以OpenSSL::SSL::VERIFY_PEER准确提供错误,表明它正在尝试验证证书,尽管设置.

我如何说服ruby忽略无效证书并连接?

小智 29

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
Run Code Online (Sandbox Code Playgroud)

  • 我不得不添加`require"net/https"`,之前只有`require"net/http"` (2认同)

小智 10

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

@doc = Nokogiri::HTML(open(my_url,  :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))
Run Code Online (Sandbox Code Playgroud)