2009-07-11 49 views
41

我尝试通过https连接访问open-uri文件。不幸的是,有些证书错误,我得到一个证书验证失败错误。我无法做任何事情,所以我必须绕过验证。如何在open-uri中绕过SSL证书验证?

我发现这个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 

回答

59

如果你真的不想使用证书验证的额外的安全性,并可以升级到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("") 
38

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

我不得不把它分为:yourrailsapp/initalizers/

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

并提出:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+8

如果出现'动态常量赋值'错误,请执行以下操作:OpenSSL :: SSL.const_set(:VERIFY_PEER,OpenSSL :: SSL :: VERIFY_NONE) – Sam 2014-02-04 18:58:17

+3

并且为了避免出现警告:已经初始化常量OpenSSL :: SSL :: VERIFY_PEER`警告,使用`remove_const`首先删除该常量,然后重新添加。这很难输入到注释中,所以[请查看这个要点](https://gist.github.com/siruguri/66926b42a0c70ef7119e)。 – sameers 2015-04-14 18:50:05

+0

如果您使用的是ruby 1.9.3p327 + – jvenezia 2015-04-27 13:46:19

1

似乎是一个很好的候选列入environment.rb中,如果此黑客只在特定的环境中使用,然后在他们的个人配置文件中使用。

13

它的好(可能产卵uninitialized constant OpenSSL (NameError))把需要在该行之前 'OpenSSL的',所以

应用程序/配置/初始化/ bypass_ssl_verification_for_open_uri.rb(初始化的文件名没有按”物质)

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

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

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

MislavMarohnić提供了非常有用的article,详细解释了为什么这很糟糕以及如何正确解决这个问题。

总之,你大多得到了SSL验证,如果错误:

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

对我来说,第一种情况下应用,只需更新CA证书包我的Ubuntu系统做到了这一点。

查找SSL错误的好工具是ssl doctor script

3

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