2011-12-19 12 views
23

Đây là mã tôi đang sử dụng để kết nối với trang web SSL.Tại sao truy cập trang web SSL bằng Cơ chế trên Windows không thành công, nhưng trên máy Mac hoạt động?

require 'mechanize' 
a = Mechanize.new 
page = a.get 'https://site.com' 

I "m sử dụng bởi Ruby 1.9.3 và cơ giới hóa 2.1pre1 + phụ thuộc Trên Mac mã trên hoạt động và trả về trang Trên cửa sổ 7 chạy các phiên bản tương tự nó mang lại cho tôi những lỗi sau:..

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 
read server certificate B: certificate verify failed 

Lùi lại đến cơ giới 2.0.1 dường như để giải quyết vấn đề này, nhưng sau đó tôi nhận được cản với vấn đề too many connections reset by peer. Vì vậy đó không phải là một giải pháp.

tôi đã thử làm a.verify_mode = false, nhưng điều đó không làm Tôi đã đọc rằng bạn có thể tu tắt xác minh SSL bằng cách sử dụng:

open(uri,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) 

Làm cách nào để tắt tính năng này trong Cơ chế? Tại sao tôi chỉ nhận được lỗi này trên Windows?

Trả lời

38

Phiên bản OpenSSL (thư viện được sử dụng để thiết lập kết nối an toàn với Net::HTTPS) không thể tìm đúng chuỗi chứng chỉ trong máy tính của bạn.

Để xấu, OpenSSL của chúng tôi không bao giờ có thể sử dụng bộ lưu trữ chứng chỉ được cài đặt Windows để xác thực máy chủ từ xa do đó không thành công.

Từ ví dụ của bạn, bạn có thể làm:

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

Để tránh việc xác minh, tuy nhiên đó là xa lý tưởng (do vấn đề an ninh rõ ràng)

tôi khuyên bạn nên tải về một số bó cert (như những từ curl):

http://curl.haxx.se/ca

Và sửa đổi mã của bạn để một cái gì đó như thế này:

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/" 

Đó dường như làm việc, Ruby 1.9.3-p0 (i386-mingw32), Windows 7 x64 và cơ giới hóa 2.1.pre.1

Hy vọng rằng sẽ giúp.

+0

Nếu bạn đang thử nghiệm SSL của một loạt gọi kiểm tra nếu nó có giá trị là không cần thiết. Miễn là mã hóa vẫn giữ? Bạn có biết cách thêm điều kiện này nếu nền tảng là cửa sổ không? –

+0

@KassymDorsel đã cập nhật mã để sử dụng nền tảng có điều kiện, hy vọng điều đó sẽ hữu ích. –

+2

Tôi đã sử dụng a.agent.http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE cho nhiều dự án nhưng bây giờ khi tôi đang sử dụng cùng một điều nó không có hiệu lực. Tôi vẫn nhận được lỗi SSL 'OpenSSL :: SSL :: SSLError ngoại lệ: SSL_connect trả về = 1 errno = 0 state = SSLv2/v3 đọc máy chủ hello A: (null) 'trong khi trong các dự án khác nó hoạt động tốt ... ruby ​​1.9. 2 và đường ray 3.2.0 – RAJ

6

Luis' câu trả lời có vẻ tốt đẹp nhưng tổng quát hơn:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+0

Bạn nên tránh thực hiện VERIFY_NONE, điều đó sẽ đánh bại mục đích sử dụng HTTPS/SSL ngay từ đầu nếu bạn không xác minh bữa tiệc khác. Nếu bạn đang kết nối thông qua proxy trong suốt hoặc DNS được sửa đổi để chuyển hướng bạn tới địa điểm giả mạo là địa chỉ thực, bạn sẽ không bao giờ biết ... –

+6

Có nhưng bạn thường không quan tâm đến những điều như vậy khi cào trang web. – pguardiario

+0

Vẫn nhận được lỗi tương tự 'OpenSSL :: SSL :: SSLError Ngoại lệ: SSL_connect trả về = 1 errno = 0 state = SSLv2/v3 đọc máy chủ hello A: (null)' – RAJ

Các vấn đề liên quan