为什么在Windows上使用Mechanize访问SSL站点失败,但在Mac上工作?

Kas*_*sel 24 ruby mechanize

这是我用来连接SSL站点的代码.

require 'mechanize'
a = Mechanize.new
page = a.get 'https://site.com'
Run Code Online (Sandbox Code Playgroud)

我正在使用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
Run Code Online (Sandbox Code Playgroud)

恢复到Mechanize 2.0.1似乎解决了这个问题,但后来我遇到了这个too many connections reset by peer问题.因此,这不是解决方案.

我已经尝试过a.verify_mode = false,但这没有做任何事情.我已经读过您可以使用以下命令关闭SSL验证:

open(uri,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)
Run Code Online (Sandbox Code Playgroud)

如何在Mechanize中将其关闭?为什么我只在Windows上出现此错误?

Lui*_*ena 38

OpenSSL(用于与之建立安全连接的库Net::HTTPS)的版本无法在您的计算机中正确查找证书链.

对我们来说,OpenSSL从未能够使用Windows安装的证书存储来验证远程服务器,因此失败了.

从您的示例中,您可以:

a.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
Run Code Online (Sandbox Code Playgroud)

为避免验证,但这远非理想(由于明显的安全问题)

我建议你下载一些证书包(如curl中的那些):

http://curl.haxx.se/ca

并将您的代码修改为以下内容:

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/"
Run Code Online (Sandbox Code Playgroud)

这似乎工作,Ruby 1.9.3-p0(i386-mingw32),Windows 7 x64和机械化2.1.pre.1

希望有所帮助.

  • 我在许多项目中使用了a.agent.http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE,但现在当我使用相同的东西时它不起作用.我仍然得到SSL错误`OpenSSL :: SSL :: SSLError异常:SSL_connect返回= 1 errno = 0状态= SSLv2/v3读取服务器问候答:(null)`而在其他项目中它工作正常... ruby​​ 1.9. 2和轨道3.2.0 (2认同)

pgu*_*rio 6

路易斯的答案看起来很好但更普遍:

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

  • 是的但是在抓取网页时你通常不关心这些事情. (6认同)