2012-02-07 9 views
12

बनाया है मेरे पास एक परीक्षण वातावरण है जो एक https कनेक्शन पर सर्वर चलाने के लिए रूबी का उपयोग करता है। चूंकि रूबी के नवीनतम संस्करण एक अवैध सर्वर के साथ एक https सर्वर से कनेक्ट करने से इनकार करते हैं (this earlier question of mine देखें) और मैं रूबी के एक नए संस्करण का उपयोग शुरू करना चाहता हूं, मैं एक वैध प्रमाणपत्र स्थापित करने की कोशिश कर रहा हूं।सीए द्वारा हस्ताक्षरित प्रमाणपत्र के साथ सर्वर पर https का उपयोग करके कनेक्टिंग मैंने

मैंने उपयोग करने के लिए एक सीए प्रमाणपत्र बनाया है (कई सर्वरों का परीक्षण किया जा रहा है, इसलिए यह आसान तरीका लगता है), और सर्वर पर स्थापित एक नए प्रमाणपत्र पर हस्ताक्षर करने के लिए सफलतापूर्वक इसका उपयोग किया गया है और इसका उपयोग किया जा रहा है। मैंने ब्राउज़र स्टोर में सीए प्रमाण पत्र जोड़ा है और यह (ब्राउज़र) अब शिकायत के बिना सर्वर से कनेक्ट होगा। इसलिए मुझे विश्वास है कि मेरे प्रमाणपत्र वैध हैं और सही तरीके से स्थापित हैं।

मुझे पता है कि रूबी ब्राउज़र के समान स्टोर का उपयोग नहीं करता है। मैंने अन्य (सार्वजनिक) सर्वर से कनेक्ट करने के लिए सीए फ़ाइल here उपलब्ध कराई है (Net::HTTP#ca_file= विधि का उपयोग करके सेट करें) और यह भी काम करता है।

जो मैं काम नहीं कर सकता वह रूबी मेरे प्रमाण पत्र का उपयोग कर मेरे सर्वर से जुड़ रहा है। मैं अपने प्रमाण पत्र (ऊपर लिंक की गई फ़ाइल के लिए अपने प्रमाणपत्र जोड़ने सहित) पर यह इशारा कर के विभिन्न तरीकों की कोशिश की है और यह हमेशा एक ही त्रुटि देता है:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (OpenSSL::SSL::SSLError) 

क्या मैं रूबी को समझाने के लिए मेरी प्रमाण पत्र स्वीकार करने के लिए मुझे क्या करना होगा और मेरे सर्वर से कनेक्ट करें?

कोड मैं का उपयोग कर रहा है:

require 'net/https' 

uri = URI.parse("https://hostname/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
http.ca_file = "My CA cert file" 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

मैं यह सोचते कर रहा हूँ इस किसी भी तरह गलत है। मैं क्या जानना चाहता हूं, मुझे अपने सीए प्रमाण पत्र का उपयोग करने के लिए क्या करना चाहिए?

+0

आप कहते हैं कि आप रूबी के साथ अपना सर्वर भी चलाते हैं? क्या आप क्लाइंट और सर्वर के लिए प्रासंगिक कोड स्निपेट पोस्ट कर सकते हैं? – emboss

+0

@emboss सर्वर रूबी नहीं है (यह वास्तव में tomcat है हालांकि मुझे लगता है कि यह महत्वपूर्ण नहीं है)। मुझे यकीन नहीं है कि आप कौन सा कोड देखना चाहते हैं। मैं बस मानक रूबी https पुस्तकालय का उपयोग कर रहा हूँ। – Jonathan

+0

@ जोनाथन, क्लाइंट कोड चिपका रहा है जिसे आप अपने सर्वर से कनेक्ट करने के लिए उपयोग कर रहे हैं, एक प्रारंभिक बिंदु होगा। –

उत्तर

20

मुझे लगता है कि आपके टॉमकैट को प्रोटोकॉल संस्करण पसंद नहीं है जो रूबी बातचीत करने की कोशिश करता है। रूबी डिफ़ॉल्ट रूप से SSLv23 का उपयोग करता है, लेकिन मैंने अन्य मामलों को सुना है जहां यह जावा-आधारित वेब सर्वर के लिए एक समस्या थी। आपके द्वारा प्राप्त त्रुटि संदेश इंगित करता है कि कनेक्शन सेट अप करते समय हैंडशेक विफल रहता है और सर्वर की प्रतिक्रिया को पढ़ने का प्रयास करता है। या तो

http.ssl_version = :TLSv1 

या

http.ssl_version = :SSLv3 

जोड़ने का प्रयास करें और देखते हैं कि अगर पहले से ही मदद करता है।

यदि यह अभी तक समस्या को ठीक नहीं करता है, तो यह देखना बहुत दिलचस्प होगा कि आपका सर्वर कनेक्शन प्रयास को अस्वीकार क्यों करता है। -Djavax.net.debug=ssl के साथ अपने टोमकैट को चलाने का प्रयास करें और प्रयास विफल होने के कारण प्रासंगिक भागों (कनेक्शन जानकारी, अपवाद स्टैकट्रैक) पोस्ट करें।

+0

यह काम करता है! बहुत बहुत धन्यवाद। मुझे पता था कि यह कुछ आसान होना था मैं लापता था! – Jonathan

+0

आपका स्वागत है! असल में, आप भी मेरी मदद कर सकते हैं। मुझे यह पता लगाने की ज़रूरत है कि यह जावा पक्ष पर एक वास्तविक बग है या नहीं। क्लाइंट साइड पर एसएसएलवी 23 का उपयोग करना सर्वर को यह कहने जैसा है कि "मैं कोई भी प्रोटोकॉल कर सकता हूं जिसे आप चाहते हैं, बस इसे नाम दें", इसलिए टोमकैट को पहले स्थान पर खारिज नहीं किया जाना चाहिए था। आप किस सटीक टोमकैट संस्करण का उपयोग कर रहे हैं, जो जेडीके? – emboss

+0

ब्याज से, अगर आपको पता चल जाए, तो क्या यह डिफ़ॉल्ट हाल ही में बदला गया था? यह समस्या केवल नवीनतम रिलीज (1.8.7-पी 352 और 1.9.2 पी 2 9 0) के साथ होती है। पहले के संस्करण ठीक हैं। – Jonathan

0

सुनिश्चित करें कि आपकी प्रमाणपत्र फ़ाइल पीईएम प्रारूप में है, सीआरटी नहीं है (इसलिए documentation for Net::HTTP in Ruby 1.9.3 कहता है)।

अद्यतन ऐसा लगता है कि प्रलेखन अद्यतित नहीं है, रूबी 1.9.3 किसी भी प्रकार का प्रमाणपत्र स्वीकार करेगा।

+0

इससे कोई फर्क नहीं पड़ता। रुबी (बंडल) पीईएम प्रमाणपत्र फाइलों के साथ-साथ डीईआर-एन्कोडेड प्रमाणपत्रों के साथ भी निपट सकता है। यह वास्तव में इसकी सुविधाजनक सुविधाओं में से एक है, आपको इस बात की परवाह नहीं है कि आपके प्रमाणपत्रों के प्रारूप में क्या है। – emboss

+0

प्रलेखन अन्यथा http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#attribute-i-ca_file कहता है लेकिन मैं आपको विश्वास करूंगा, मैं कभी नहीं गैर-पीईएम प्रमाणपत्रों के साथ प्रयास किया। – gioele

+0

ओह, मुझे खेद है, तो मुझे प्रलेखन को अपडेट करने की आवश्यकता है :) मेरा बुरा, क्या आप एक माइक्रो संपादन कर सकते हैं, ताकि मैं डाउनवोट को दूर कर सकूं? – emboss

2

मैं रूबी 1.9.3 का उपयोग कर रहा हूं और कुछ सुरक्षित यूआरएल पार्स करने के लिए नोकोगिरी का उपयोग करते समय एक ही त्रुटि का सामना कर रहा हूं।

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null) 

ऊपर नक्काशी द्वारा प्रदान की जवाब सही है, लेकिन यकीन है कि ssl उत्पन्न त्रुटि यह एक है कि ऊपर उल्लेख किया है बनाते हैं।मैंने इसका पालन किया है और नीचे उल्लिखित समाधान मिला है।

uri = URI(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ssl_version = :SSLv3 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
response = http.get(url) 

अब प्रतिसाद सही एचटीएमएल सुरक्षित यूआरएल कि URL में कोड को पारित कर दिया है के लिए पार्स हो रही है।

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