【问题标题】:How to connect to an https server with an invalid certificate using the latest versions of Ruby如何使用最新版本的 Ruby 连接到带有无效证书的 https 服务器
【发布时间】:2014-02-05 06:36:50
【问题描述】:

考虑以下代码:

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 是服务器上具有无效证书的有效地址。

在旧版本的 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

在最后一行。

将 verify_mode 更改为 OpenSSL::SSL::VERIFY_PEER 会给出错误提示,尽管进行了设置,但它仍在尝试验证证书。

如何说服 ruby​​ 忽略无效证书并进行连接?

【问题讨论】:

    标签: ruby ssl


    【解决方案1】:
    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
    

    【讨论】:

    • 使用 #start 而不是 #post_form 和验证模式属性也为我解决了这个问题。看起来很奇怪……谢谢你的建议。
    • 为什么一定要使用start方法?
    • 我必须添加require "net/https",之前只有require "net/http"
    • 您可能还需要require 'openssl'
    【解决方案2】:
    require 'nokogiri'
    require 'open-uri'
    require 'net/https'
    
    @doc = Nokogiri::HTML(open(my_url,  :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))
    

    【讨论】:

    • 在 ruby​​ 2.2.2 open(my_url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) 就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多