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

Rol*_*der 49 ruby-on-rails

我尝试通过https连接使用open-uri访问文件.不幸的是,证书有些错误,我得到证书验证失败错误.我无能为力,所以我不得不绕过验证.

我找到了这个答案

我不想/不能改变服务器上的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
Run Code Online (Sandbox Code Playgroud)

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

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Run Code Online (Sandbox Code Playgroud)

sam*_*ers 74

警告,不要在生产中执行此操作,您将以这种方式完全禁用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("")
Run Code Online (Sandbox Code Playgroud)


Rol*_*der 41

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

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

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

并把:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Run Code Online (Sandbox Code Playgroud)

  • 如果您收到"动态常量赋值"错误,请执行以下操作:OpenSSL :: SSL.const_set(:VERIFY_PEER,OpenSSL :: SSL :: VERIFY_NONE) (10认同)
  • 那个答案是个笑话 (5认同)
  • 并且为了避免出现`警告:已经初始化的常量OpenSSL :: SSL :: VERIFY_PEER`警告,使用`remove_const`首先删除常量,然后重新添加.这很难输入注释所以[查看这个要点代替(https://gist.github.com/siruguri/66926b42a0c70ef7119e). (4认同)
  • @RolandStuder downvotes用于建议`OpenSSL :: SSL :: VERIFY_PEER = OpenSSL :: SSL :: VERIFY_NONE`.你正在重新定义一些非常重要的安全相关代码(非常糟糕)中的常量(坏).如果_anyone_包含您的代码(或任何人愚蠢的代码将您的解决方案复制粘贴到他们的代码中),那么他们就会立即禁用SSL验证而不会意识到这一点).如果您能够更新您的答案以包含某种警告或免责声明,那将会很棒.*没有人应该在公共场所或生产代码中执行此操作* (2认同)

Iva*_*ana 14

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

  • 如何在脚本上使用它?我已经尝试了,我收到了'警告:已经初始化了常量VERIFY_PEER.' 它不起作用 (3认同)

pym*_*kin 12

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

MislavMarohnić撰写了一篇非常有用的文章,详细说明了为什么这很糟糕以及如何妥善解决这个问题.

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

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

对我来说,应用的第一个案例,只是更新我的Ubuntu系统上的ca-certificates包就可以了.

ssl doctor脚本是一个很好的工具来跟踪你的SSL错误.