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

时间:2009-07-11 10:27:56

标签: ruby-on-rails

我尝试通过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

7 个答案:

答案 0 :(得分:71)

警告,请勿在生产中执行此操作,而是以这种方式完全禁用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("")

答案 1 :(得分:40)

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

我必须把它放进:yourrailsapp/initalizers/

我在那里创建了bypass_ssl_verification_for_open_uri.rb

然后说:

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

答案 2 :(得分:13)

它很好(它可能会产生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

答案 3 :(得分:12)

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

MislavMarohnić有一个非常有帮助的article,它详细说明了为什么这很糟糕以及如何妥善解决这个问题。

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

  1. 证书有效,但您的系统没有必要的根证书进行验证。
  2. 证书是自签名的,例如在你的公司,你需要信任它
  3. 你受到中间人攻击
  4. 对我来说,应用了第一个案例,只需更新我的Ubuntu系统上的ca-certificates包就可以了。

    追踪SSL错误的一个很好的工具是ssl doctor script

答案 4 :(得分:4)

这是您的通话,但将VERIFY_PEER设置为NONE基本相同 完全禁用TLS并通过纯文本HTTP连接。它使 中间人攻击琐碎,不会通过PCI审核。

答案 5 :(得分:3)

弱但受控的方式是

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

答案 6 :(得分:1)

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