2011-12-19 16 views
23

यह वह कोड है जिसका उपयोग मैं SSL साइट से कनेक्ट करने के लिए कर रहा हूं।विंडोज़ पर मैकेनाइजेशन के साथ एक एसएसएल साइट का उपयोग क्यों विफल रहता है, लेकिन मैक पर काम करता है?

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

मैं "मी रूबी 1.9.3 का उपयोग कर और 2.1pre1 + निर्भरता मशीनीकरण का उपयोग कर मैक पर उपरोक्त कोड काम करता है और पृष्ठ को वापस लौटा विंडोज 7 में एक ही संस्करणों यह मुझे निम्न त्रुटि देता चल पर:।।

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

2.0.1 मशीनीकरण पर वापस लाया जा

मैं a.verify_mode = false कर की कोशिश की है इस समस्या को हल करने के लिए लगता है, लेकिन मैं तो too many connections reset by peer समस्या से त्रस्त हो जाते हैं। इस प्रकार है कि एक समाधान नहीं है।, लेकिन वह ऐसा नहीं करता है कुछ भी। मैंने पढ़ा है कि आप कर सकते हैं उपयोग करके एसएसएल सत्यापन बंद करें:

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

मैकेनाइजेशन में इसे कैसे बंद कर सकता हूं? मुझे विंडोज़ में यह त्रुटि क्यों मिल रही है?

उत्तर

38

ओपनएसएसएल का संस्करण (पुस्तकालय Net::HTTPS के साथ सुरक्षित कनेक्शन स्थापित करने के लिए प्रयुक्त होता है) आपके कंप्यूटर में प्रमाणपत्र श्रृंखला को सही तरीके से ढूंढने में सक्षम नहीं है।

हमारे खराब होने के लिए, ओपनएसएसएल दूरस्थ सर्वर को प्रमाणित करने के लिए Windows स्थापित प्रमाणपत्र संग्रहण का उपयोग करने में सक्षम नहीं था, इसलिए इसकी वजह से विफल रहा है।

अपने उदाहरण से, आप कर सकते हैं:

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

सत्यापन बचने के लिए, लेकिन है कि आदर्श से दूर (कारण स्पष्ट सुरक्षा के मुद्दों)

मैं है कि आपने किसी प्रमाणपत्र बंडलों डाउनलोड की सलाह देते हैं (है कर्ल से हैं):

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/" 
काम करते हैं, रूबी 1.9.3-p0 (i386-mingw32), विंडोज 7 x64 और मशीनीकरण 2.1.pre.1

आशा है कि मदद करता है लगता है कि

+0

आप किसी ज्ञात मेजबान पता चल सके कि इसकी वैधता की की एसएसएल परीक्षण कर रहे हैं आवश्यक नहीं है। जब तक एन्क्रिप्शन अभी भी रखता है? क्या आप जानते हैं कि प्लेटफार्म खिड़कियां होने पर यह सशर्त रूप से कैसे जोड़ना है? –

+0

@ KassymDorsel ने मंच को सशर्त बनाने के लिए कोड अपडेट किया, उम्मीद है कि मदद करता है। –

+2

मैंने कई परियोजनाओं के लिए a.agent.http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE का उपयोग किया लेकिन अब जब मैं एक ही चीज़ का उपयोग कर रहा हूं तो यह प्रभावी नहीं होता है। फिर भी मुझे एसएसएल त्रुटि मिल रही है 'ओपनएसएसएल :: एसएसएल :: एसएसएलआरआरआर अपवाद: एसएसएल_कनेक्ट लौटा = 1 errno = 0 राज्य = एसएसएलवी 2/वी 3 पढ़ें सर्वर हैलो ए: (शून्य)' जबकि अन्य परियोजनाओं में यह ठीक काम करता है ... रूबी 1.9। 2 और रेल 3.2.0 – RAJ

6

लुइस 'जवाब ठीक है, लेकिन अधिक आम तौर पर दिखता है:

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

आपको VERIFY_NONE करने से बचना चाहिए, जो पहले स्थान पर HTTPS/SSL का उपयोग करने के उद्देश्य को हरा देता है यदि आप सत्यापित नहीं कर रहे हैं दूसरी पार्टी। यदि आप एक पारदर्शी प्रॉक्सी या संशोधित DNS से ​​कनेक्ट कर रहे हैं जो आपको नकली असली जगह पर रीडायरेक्ट करता है, तो आपको कभी पता नहीं चलेगा ... –

+6

हां, लेकिन आमतौर पर आपको वेबपृष्ठ को स्क्रैप करते समय ऐसी चीजों की परवाह नहीं है। – pguardiario

+0

अभी भी एक ही त्रुटि हो रही है 'ओपनएसएसएल :: एसएसएल :: एसएसएलआरआरआर अपवाद: एसएसएल_कनेक्ट लौटा = 1 errno = 0 राज्य = एसएसएलवी 2/वी 3 सर्वर पढ़ें हैलो ए: (शून्य) ' – RAJ

संबंधित मुद्दे