我尝试通过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
答案 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验证错误:
对我来说,应用了第一个案例,只需更新我的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,那么在他们各自的配置文件中。