【问题标题】:How to bypass SSL certificate verification in open-uri?如何绕过 open-uri 中的 SSL 证书验证?
【发布时间】:2010-11-09 22:47:40
【问题描述】:

我尝试通过 https 连接使用 open-uri 访问文件。不幸的是,证书有问题,我收到 证书验证失败 错误。我对此无能为力,所以我必须绕过验证。

我找到了这个answer

我不想/不能更改服务器上的 oen-uri.rb,我正在运行 Ruby 1.8.6。

如何更改验证模式?或者更确切地说,我应该在哪里更改它?

我可以把这个放在哪里?

if target.class == URI::HTTPS  
 require 'net/https'  
 http.use_ssl = true   
 http.verify_mode = OpenSSL::SSL::VERIFY_NONE  
 store = OpenSSL::X509::Store.new  
 store.set_default_paths  
 http.cert_store = store
end

或肮脏的黑客:我可以把这个放在哪里?

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    现在我自己发现了:我使用了肮脏的 hack,对我来说效果很好。

    我不得不把它放到:yourrailsapp/initalizers/

    在那里我创建了一个bypass_ssl_verification_for_open_uri.rb

    然后放:

    OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
    

    【讨论】:

    • 如果您收到“动态常量分配”错误,请执行以下操作:OpenSSL::SSL.const_set(:VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE)
    • 为了避免warning: already initialized constant OpenSSL::SSL::VERIFY_PEER 警告,请使用remove_const 在重新添加之前先删除常量。这很难在评论中输入,所以check out this gist instead
    • 如果您使用的是 ruby​​ 1.9.3p327+,请首选 @sameers 答案
    • 那个答案是个笑话
    • @RolandStuder 反对票是为了建议OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE。您在一些非常重要的安全相关代码(非常非常糟糕)中重新定义了一个常量(糟糕)。如果 任何人 包含您的代码(或任何愚蠢的人编写的代码,将您的解决方案复制粘贴到他们的代码中),那么他们会立即禁用 SSL 验证)甚至没有意识到)。如果您可以更新您的答案以包含某种警告或免责声明,那就太好了。 任何人都不应该在公共或生产代码中这样做
    【解决方案2】:

    似乎是包含在 environment.rb 中的一个很好的候选者,或者如果这个 hack 仅在特定环境中是必要的,那么在它们各自的配置文件中。

    【讨论】:

      【解决方案3】:

      在该行之前放置 require 'openssl' 很好(它可能会产生 uninitialized constant OpenSSL (NameError)),所以

      app/config/initializers/bypass_ssl_verification_for_open_uri.rb(初始化器的文件名无关紧要)

      require 'openssl'
      OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

      【讨论】:

      • 如何在脚本中使用它?我已经尝试过了,我得到了“警告:已经初始化常量 VERIFY_PEER。”它不起作用
      • 看来,那个常量 VERIFY_PEER 已经在某个地方定义了,你得到 certify 验证错误?
      • 在使用 Docker 和 ngrok 复制生产环境时,在 2020 年和 Rails 5 中仍然非常相关和有帮助,在开发机器上通过 SSL 进行服务器到服务器通信。 (可以肯定的是,Puma 作为网络服务器对证书如此严格。)但是:将代码放在 if Rails.env.development? 上面对于确保它永远不会在您的生产应用程序中禁用 SSL 至关重要
      【解决方案4】:

      一种微弱但可控的方式是

      class XMLRPC::Client
       # WEAK: Enrich the Client with a method for disabling SSL VERIFICATION
       # See /usr/lib/ruby/1.9.1/xmlrpc/client.rb:324
       # Bad hack but it works
       def disableSSLVerification
         @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         warn "Proxyman SSL Verification disabled"
       end
      end
      

      然后你只需调用

      client.disableSSLVerification()
      

      【讨论】:

        【解决方案5】:

        警告,不要在生产环境中执行此操作,这样会完全禁用 SSL。

        如果你真的不想要使用证书验证的额外安全性,并且可以升级到 Ruby 1.9.3p327+,你可以将ssl_verify_mode 选项传递给open 方法。例如,这是我的做法:

        request_uri=URI.parse('myuri?that_has=params&encoded=in_it&optionally=1')
        
        # The params incidentally are available as a String, via request_uri.query
        output = open(request_uri, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE})
        obj = JSON.parse output.readlines.join("")
        

        【讨论】:

        • @JimmyDean 2.2.1p85 on mac os x here, verify_mode 不起作用。
        • @nurettin - 你是 100% 正确的。我看错了宝石。 HTTPClient 它是 verify_mode。我已通过评论删除,以免出现错误信息。感谢您指出了这一点。 rubydoc.info/gems/httpclient/…
        • 太棒了,完美救了我的命。 +1
        • 我想补充一点,想要禁用它是有正当理由的。顺便说一句,我也可以使用 wget 来做到这一点。我试图从以下 URL 获取 slackware 包的文件列表:slackware.nl/alien-kde/current/latest/x86_64/FILELIST.TXT 但 open-uri 失败,因为它使用了自签名证书。我知道我们不应该信任随机的人,但是设置它的家伙只是一个老式的 slackware 用户,我已经可以在我的浏览器中看到该文件,所以只有 ruby​​ 会给我带来问题,因为openssl 的默认行为。这就是灵活性很重要的原因
        【解决方案6】:

        正如您自己提到的,这是一个肮脏的黑客攻击。显然,禁用 SSL 证书验证不是一个好主意。

        Mislav Marohnić 提供了一个非常有用的article,其中详细介绍了为什么这是不好的以及如何正确解决这个问题。

        总之,如果出现以下情况,您通常会收到 SSL 验证错误:

        1. 证书有效,但您的系统没有验证所需的根证书。
        2. 证书是自签名的,例如在您的公司中,您需要信任它
        3. 您受到中间人攻击

        对我来说,第一种情况适用,只需在我的 Ubuntu 系统上更新 ca-certificates 包就可以了。

        ssl doctor script 是追踪 SSL 错误的好工具。

        【讨论】:

          【解决方案7】:

          这是你的电话,但将 VERIFY_PEER 设置为 NONE 基本上是等效的 完全禁用 TLS 并通过纯文本 HTTP 连接。它使 中间人攻击微不足道,不会通过 PCI 审核。

          【讨论】:

          • 这不是坏,但是是的。这很糟糕。
          猜你喜欢
          • 2021-02-08
          • 2017-08-29
          • 1970-01-01
          • 2014-07-07
          • 2016-06-03
          • 1970-01-01
          • 2021-06-22
          • 2020-05-20
          • 2017-08-06
          相关资源
          最近更新 更多