2012-10-11 21 views
8

में एक एसएसएल सक्षम टीसीपी/आईपी कनेक्शन कैसे स्थापित करें मुझे अपने सर्वर के साथ एक टीसीपी कनेक्शन स्थापित करने की आवश्यकता है जिसमें एक एसएसएल सक्षम पोर्ट है, जिसे मुझे एक्सेस करने की आवश्यकता है।रुबी

मुझे एक XML फ़ाइल भेजने और सर्वर से प्रतिक्रिया प्राप्त करने की आवश्यकता है।

एसएसएल सक्षम होने से पहले, मैं नीचे उल्लिखित कोड का उपयोग कर सर्वर से डेटा प्राप्त करने में सक्षम था।

require 'socket' 
myXML = 'test_xml' 
host = 'myhost.com' 
port = 12482    

socket = TCPSocket.open(host,port) # Connect to server 
socket.send(myXML, 0) 
response = socket.recvfrom(port) 
puts response 
socket.close 

अब मैं एक 'certi.pfx' जिसके साथ मैं एक संबंध स्थापित, my_xml डेटा भेजें और प्रतिक्रिया प्राप्त करने की आवश्यकता है। यह कैसे किया जा सकता है।

मैं यह भी जानना चाहूंगा कि मेरे पास 'पेम' और 'की' फ़ाइल है, मैं कनेक्शन कैसे स्थापित कर सकता हूं, my_xml डेटा भेज सकता हूं और प्रतिक्रिया प्राप्त कर सकता हूं।

कृपया मदद करें।

उत्तर

14
require 'socket' 
require 'openssl' 

myXML = 'my_sample_data' 
host = 'my_host.com' 
port = my_port     

socket = TCPSocket.open(host,port) 
ssl_context = OpenSSL::SSL::SSLContext.new() 
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("certificate.crt")) 
ssl_context.key = OpenSSL::PKey::RSA.new(File.open("certificate.key")) 
ssl_context.ssl_version = :SSLv23 
ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context) 
ssl_socket.sync_close = true 
ssl_socket.connect 

ssl_socket.puts(myXML) 
while line = ssl_socket.gets 
    p line 
end 
ssl_socket.close 
+0

हैलो, अगर मुझे सॉकेट बंद नहीं करना है तो मुझे क्या करना चाहिए? – freeze

+0

मुझे लगता है कि आप अंतिम पंक्ति ssl_socket.close को हटा सकते हैं, यह कनेक्शन को खुला रखेगा। बिल्कुल यकीन नहीं है –

3

इस तरह:

sock = TCPSocket.new('hostname', 443) 
    ctx = OpenSSL::SSL::SSLContext.new 
    ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER) 
    @socket = OpenSSL::SSL::SSLSocket.new(sock, ctx).tap do |socket| 
    socket.sync_close = true 
    socket.connect 
    end 
+0

रोमन - आपके उत्तर के लिए धन्यवाद। लेकिन एक बात यह है कि मुझे प्रमाणपत्र फाइल निर्दिष्ट करने की आवश्यकता है। वास्तव में मैं सॉकेट प्रोग्रामिंग के लिए नया हूँ। जब मैंने उपर्युक्त कोड का उपयोग किया तो मुझे एक त्रुटि मिली "कनेक्ट: एसएसएल_कनेक्ट लौटा = 1 errno = 0 राज्य = एसएसएलवी 3 सर्वर प्रमाण पत्र पढ़ें बी: प्रमाण पत्र सत्यापित विफल (ओपनएसएसएल :: एसएसएल :: एसएसएलआरआरआरआर)" –

+0

मेरे पास एक विशिष्ट पोर्ट 12482 है। जिसके लिए मुझे –

+0

कनेक्ट करने की आवश्यकता है आपको सीए बंडल (ca_path: '/ path', ca_file: 'ca-bundle.crt') निर्दिष्ट करने की आवश्यकता है और आपको पीईएम फॉर्म में प्रमाणपत्र (प्रमाणपत्र) निर्दिष्ट करने की आवश्यकता है। आरई ओपनएसएसएल :: एसएसएल :: एसएसएलकॉन्टेक्स्ट – Roman