2012-01-24 15 views
8

मैं एसएसएल Net::HTTP का उपयोग कर संसाधन लाने की कोशिश कर रहा हूं।रूबी 1.8.7 और नेट :: HTTP: क्लाइंट प्रमाण पत्र के साथ एक एसएसएल प्राप्त अनुरोध बनाना?

req = Net::HTTP::Get.new(ContentURI.path) 
https = Net::HTTP.new(ContentURI.host, ContentURI.port) 
https.use_ssl = true 
https.cert = OpenSSL::X509::Certificate.new(@cert_raw) 
https.key = OpenSSL::PKey::RSA.new(@cert_key_raw) 
https.verify_mode = OpenSSL::SSL::VERIFY_PEER 
https.ca_file = File.join(TestDataPath, 'cacert.pem') 
resp = https.start { |cx| cx.request(req) } 

या वैकल्पिक अंतिम पंक्ति के साथ:

resp = https.get(ContentURI.path) 

मैं सत्यापित किया है कि विभिन्न बिट्स (प्रमाणपत्र, कुंजी, CA प्रमाणपत्र, आदि) सही हैं यहाँ प्रासंगिक कोड टुकड़ा है ।

समस्या

कि cx.request(req) एक अपवाद फेंकता है:

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server session ticket A 

सर्वर पर अपाचे एसएसएल त्रुटि लॉग निम्नलिखित शामिल हैं:

[Tue Jan 24 11:47:26 2012] [debug] ssl_engine_kernel.c(1876): OpenSSL: Loop: SSLv3 read finished A 
[Tue Jan 24 11:47:26 2012] [debug] ssl_engine_kernel.c(1905): OpenSSL: Exit: error in SSLv3 write session ticket A 
[Tue Jan 24 11:47:26 2012] [debug] ssl_engine_kernel.c(1905): OpenSSL: Exit: error in SSLv3 write session ticket A 
[Tue Jan 24 11:47:26 2012] [info] [client 10.11.88.53] SSL handshake interrupted by system [Hint: Stop button pressed in browser?!] 
[Tue Jan 24 11:47:26 2012] [info] [client 10.11.88.53] Connection closed to child 0 with abortive shutdown (server _SERVERNAME_:443 

प्रमाणपत्र, कुंजी, और CA प्रमाणपत्र फ़ाइल काम इस एसएसएल मेजबान के साथ अन्य उपकरणों के माध्यम से; मुझे Net::HTTP[S] का उपयोग करके सफलतापूर्वक उस सफलता को पुन: पेश करने में परेशानी हो रही है।

किसी भी व्यक्ति को धन्यवाद जो यह पहचान सकता है कि मैं क्या गलत कर रहा हूं!

उत्तर

5

मैं कहूंगा कि यह रूबी के साथ समस्या के बजाय आपके अपाचे सेटअप का मामला है।

इस चेक आउट:

$ curl https://palladium.wejn.cz/sslcerttest/ 
curl: (56) SSL read: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure, errno 0 
$ curl https://palladium.wejn.cz/sslcerttest/ -E client.pem 
<pre>Yop.</pre> 

और फिर:

#!/usr/bin/ruby 
require 'net/http' 
require 'net/https' 
require 'openssl' 
require 'uri' 

ContentURI = URI.parse("https://palladium.wejn.cz/sslcerttest/") 
@cert_raw = File.read('client.pem') 
@cert_key_raw = @cert_raw 
TestDataPath = '.' 

req = Net::HTTP::Get.new(ContentURI.path) 
https = Net::HTTP.new(ContentURI.host, ContentURI.port) 
https.use_ssl = true 
https.cert = OpenSSL::X509::Certificate.new(@cert_raw) 
https.key = OpenSSL::PKey::RSA.new(@cert_key_raw) 
https.verify_mode = OpenSSL::SSL::VERIFY_PEER 
https.ca_file = File.join(TestDataPath, 'cacert.pem') 
resp = https.start { |cx| cx.request(req) } 
p resp 
p resp.body 

परिणामों में:

$ ruby a.rb 
#<Net::HTTPOK 200 OK readbody=true> 
"<pre>Yop.</pre>\n" 

$ dpkg -l ruby1.8 | tail -n1 | awk '{print $3}' 
1.8.7.302-2squeeze1 

$ ruby -v 
ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux] 

बेशक, प्रश्न में अपाचे config है:

<Directory /var/www/sslcerttest/> 
    SSLVerifyClient require 
    SSLVerifyDepth 5 
    SSLCACertificateFile /var/www/sslcerttest/cacert.pem 
    SSLCACertificatePath /var/www/sslcerttest/ 
    SSLOptions +FakeBasicAuth 
    SSLRequireSSL 
    SSLRequire %{SSL_CLIENT_S_DN_O} eq "Wejn s.r.o." and %{SSL_CLIENT_S_DN_OU} eq "Server Certificate" 
</Directory> 

शायद इस समस्या को ट्रैक करते समय अतिरिक्त विवरण (अपाचे कॉन्फ़िगरेशन के लिए कॉन्फ़िगरेशन) पोस्ट करने में कुछ मदद मिलेगी ...

+0

ओपनएसएल स्रोत को देखते हुए, त्रुटि संदेश लापता सत्र टिकट से संबंधित है (क्लाइंट-सप्लाई डेटा एसएसएल सत्र फिर से शुरू करने की आवश्यकता है); इस मामले में ऐसा क्यों नहीं हो रहा है ... – Wejn

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

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