如何在open-uri中绕过SSL证书validation?

我尝试通过https连接访问open-uri文件。 不幸的是,有些证书错误,我得到一个证书validation失败的错误。 我什么都做不了,所以我不得不绕过validation。

我find了这个答案

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

如何更改validation模式? 或者更确切地说,我在哪里改变它?

我可以把这个放在哪里?

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 

如果您确实不想使用证书validation的额外安全性,并且可以升级到Ruby 1.9.3p327 +,则可以将ssl_verify_mode选项传递给open方法。 在这里例如是我如何做到这一点:

 request_uri=URI.parse('myuri?thathas=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("") 

现在我自己发现了:我用了肮脏的黑客,这对我来说工作得很好。

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

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

并且说:

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

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

app / config / initializers / bypass_ssl_verification_for_open_uri.rb(初始化程序的文件名不重要)

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

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

MislavMarohnić写了一篇非常有用的文章 ,详细解释了为什么这是糟糕的,以及如何正确处理这个问题。

总之,如果出现以下情况,您大多会得到SSLvalidation错误:

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

对我来说,第一种情况是应用的,只是简单地更新我的Ubuntu系统上的ca-certificates包就行了。

跟踪您的SSL错误的一个好工具是ssl医生脚本 。

一个微弱但受控制的方式是

 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() 

这是您的呼叫,但将VERIFY_PEER设置为NONE基本上等同于完全禁用TLS并通过纯文本HTTP进行连接。 它使中间人的攻击变得微不足道,并且不会通过PCI审计。

看起来像是包含在environment.rb中的一个很好的候选者,或者如果这种攻击只在特定的环境中是必需的,那么在他们的个人configuration文件中是必需的。