2012-10-11 17 views
8

Ho bisogno di stabilire una connessione TCP con il mio server che ha una porta abilitata SSL, che ho bisogno di accedere.Come stabilire una connessione TCP/IP abilitata SSL in Ruby

Ho bisogno di inviare un file XML e ottenere la risposta dal server.

Prima che SSL venisse abilitato, sono stato in grado di ottenere i dati dal server utilizzando il codice riportato sotto.

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 

ora ho un 'certi.pfx' con la quale ho bisogno di stabilire una connessione, Inviare i dati my_xml e ottenere la risposta. Come si può fare.

Vorrei anche sapere se ho il file 'pem' e 'chiave', come posso stabilire una connessione, inviare i miei dati my_xml e ottenere la risposta.

Per favore aiuto.

risposta

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

Ciao, cosa devo fare se non voglio chiudere il socket? – freeze

+0

Penso che sia possibile rimuovere l'ultima riga ssl_socket.close questo manterrà la connessione aperta. Non sono sicuro esattamente –

3

Ti piace questa:

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

romani - grazie per la risposta. Ma una cosa è dove devo specificare i file del certificato. In realtà sono nuovo nella programmazione dei socket. Quando ho usato il codice precedente ho ricevuto un errore del tipo "connect: SSL_connect restituito = 1 errno = 0 stato = SSLv3 leggere il certificato del server B: verifica del certificato fallita (OpenSSL :: SSL :: SSLError)" –

+0

Ho una porta specifica 12482. A cui devo connettere –

+0

È necessario specificare il ca bundle (ca_path: '/ percorso', ca_file: 'ca-bundle.crt') ed è necessario specificare il certificato (cert) nel modulo PEM. Controlla ri OpenSSL :: SSL :: SSLContext – Roman