Почему при доступе к сайту SSL с механизмом "Механизация на Windows" происходит сбой, но на Mac работает?

Это код, который я использую для подключения к сайту 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

Reverting to 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?

Ответ 1

Версия 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 и mechanize 2.1.pre.1

Надеюсь, что это поможет.

Ответ 2

Ответ Луиса выглядит нормально, но в целом:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE