これは、SSLサイトへの接続に使用しているコードです。
require 'mechanize'
a = Mechanize.new
page = a.get 'https://site.com'
Ruby 1.9.3およびMechanize2.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でのみこのエラーが発生するのはなぜですか?
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を機械化する
お役に立てば幸いです。
ルイスの答えはうまく見えますが、より一般的には:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE