2012-10-11 7 views
8

Potrzebuję nawiązać połączenie TCP z serwerem z portem obsługującym SSL, do którego muszę uzyskać dostęp.Jak ustanowić połączenie TCP/IP z włączonym protokołem SSL w języku Ruby

Potrzebuję wysłać plik XML i uzyskać odpowiedź z serwera.

Przed włączeniem SSL udało mi się pobrać dane z serwera za pomocą poniższego kodu.

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 

Teraz mam „certi.pfx”, z którym muszę się nawiązać połączenia, wysyłanie danych my_xml i uzyskać odpowiedź. Jak to zrobić?

Chciałbym również wiedzieć, czy mam plik "pem" i "klucz", w jaki sposób mogę ustanowić połączenie, Wyślij dane my_xml i uzyskać odpowiedź.

Proszę o pomoc.

Odpowiedz

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

Witam, co powinienem zrobić, jeśli nie chcę zamknąć gniazda? – freeze

+0

Myślę, że możesz usunąć ostatnią linię ssl_socket.close, dzięki czemu połączenie pozostanie otwarte. Nie jestem pewien –

3

Jak to:

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

rzymskie - dzięki za odpowiedź. Ale jest jedna rzecz, w której muszę określić pliki certyfikatów. Właściwie jestem nowy w programowaniu gniazd. Kiedy użyłem powyższego kodu, otrzymałem komunikat o błędzie: "connect: SSL_connect zwrócony = 1 errno = 0 stan = SSLv3 odczyt certyfikatu serwera B: certyfikat nie powiódł się (OpenSSL :: SSL :: SSLError)" –

+0

Mam konkretny port 12482. Do którego muszę się podłączyć –

+0

Musisz podać pakiet ca (ca_path: '/ path', ca_file: 'ca-bundle.crt') i musisz określić certyfikat (cert) w formularzu PEM. Sprawdź ri OpenSSL :: SSL :: SSLContext – Roman

Powiązane problemy