这是我用来连接SSL站点的代码。
require 'mechanize'
a = Mechanize.new
page = a.get 'https://site.com'
我正在使用Ruby 1.9.3和Mechanize 2.1pre1 +依赖项。在Mac上,上面的代码工作并返回页面。在运行相同版本的Windows 7上,它给出了以下错误:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3
read server certificate B: certificate verify failed
恢复到Mechanize 2.0.1似乎解决了这个问题,但后来我遇到了too many connections reset by peer
问题。因此,这不是解决方案。
我尝试过a.verify_mode = false
,但这没有做任何事情。我已经读过您可以使用以下命令关闭SSL验证:
open(uri,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)
如何在Mechanize中将其关闭?为什么我只在Windows上收到此错误?
答案 0 :(得分:38)
OpenSSL(用于与Net::HTTPS
建立安全连接的库)的版本无法在您的计算机中正确找到证书链。
对我们来说,OpenSSL从未能够使用Windows安装的证书存储来验证远程服务器,因此失败了。
从您的示例中,您可以执行以下操作:
a.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
为避免验证,但这远非理想(由于明确的安全问题)
我建议您下载一些证书包(如curl中的那些):
将代码修改为以下内容:
require "rbconfig"
require "mechanize"
a = Mechanize.new
# conditionally set certificate under Windows
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
if RbConfig::CONFIG["host_os"] =~ /mingw|mswin/
# http://curl.haxx.se/ca
ca_path = File.expand_path "~/Tools/bin/curl-ca-bundle.crt"
a.agent.http.ca_file = ca_path
end
page = a.get "https://github.com/"
这似乎有用,Ruby 1.9.3-p0(i386-mingw32),Windows 7 x64和机械化2.1.pre.1
希望有所帮助。
答案 1 :(得分:6)
路易斯的回答看起来不错,但更为普遍:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
答案 2 :(得分:0)
您可以简单地执行以下操作:
agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
这适用于最新版本 2.8