2011-11-01 9 views
22
के नवीनतम संस्करण का उपयोग कर

निम्नलिखित कोड पर विचार करें गलत प्रमाण पत्र के साथ एक https सर्वर से कनेक्ट करने के लिए:रूबी

require 'net/https' 
uri = URI.parse("https://host/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

जहां https://host/index.html सर्वर पर गलत प्रमाण पत्र के साथ एक मान्य पता है।

रूबी के पुराने संस्करणों (विशेष रूप से 1.8.7-पी 334 और 1.9.2-पी 180) पर यह कोड ठीक काम करता है।

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=unknown state 
अंतिम पंक्ति पर

: हाल के सभी संस्करणों (1.8.7-p352, 1.9.2-p290 और 1.9.3-p0) पर यह निम्न अपवाद फेंकता है।

OpenSSL::SSL::VERIFY_PEER पर verify_mode बदलना वास्तव में त्रुटि बताता है कि यह सेटिंग के बावजूद प्रमाणपत्र को सत्यापित करने का प्रयास कर रहा है।

मैं अवैध प्रमाणपत्र को अनदेखा करने और कनेक्ट करने के लिए रूबी को कैसे समझा सकता हूं?

उत्तर

19
uri = URI("https://host/index.html") 
req = Net::HTTP::Get.new(uri.path) 

res = Net::HTTP.start(
     uri.host, uri.port, 
     :use_ssl => uri.scheme == 'https', 
     :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |https| 
    https.request(req) 
end 
+0

को सत्यापित मोड संपत्ति मेरे लिए बहुत समस्या समाधान के '# post_form' के बजाय का उपयोग करते हुए' # start'। अजीब लगता है ... सुझाव के लिए धन्यवाद। –

+0

आपको स्टार्ट विधि का उपयोग क्यों करना है? – jspooner

+1

मुझे केवल "आवश्यकता" नेट/https "' की आवश्यकता होती है, पहले केवल "आवश्यकता" नेट/http "' – botchniaque

9
require 'nokogiri' 
require 'open-uri' 
require 'net/https' 

@doc = Nokogiri::HTML(open(my_url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)) 
+0

रूबी 2.2.2 'में खुली (my_url,: ssl_verify_mode => OpenSSL :: SSL :: VERIFY_NONE) 'है पर्याप्त – mrt