web-dev-qa-db-ja.com

WindowsでMechanizeを使用してSSLサイトにアクセスできないのに、Macでは機能するのはなぜですか?

これは、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でのみこのエラーが発生するのはなぜですか?

24
Kassym Dorsel

OpenSSLのバージョン(Net::HTTPSとの安全な接続を確立するために使用されるライブラリ)は、コンピューターで証明書チェーンを正しく見つけることができません。

残念ながら、OpenSSLはWindowsにインストールされた証明書ストレージを使用してリモートサーバーを検証できなかったため、失敗しています。

あなたの例から、あなたはすることができます:

a.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE

ただし、検証を回避するために、それは理想からはほど遠いです(明確なセキュリティ問題のため)

いくつかの証明書バンドル(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/"

それはうまくいくようです、Ruby 1.9.3-p0(i386-mingw32)、Windows 7 x64、そして2.1.pre.1を機械化する

お役に立てば幸いです。

38
Luis Lavena

ルイスの答えはうまく見えますが、より一般的には:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
6
pguardiario