2012-10-11 25 views
8

Necesito establecer una conexión TCP con mi servidor que tiene un puerto SSL habilitado, al que necesito acceder.Cómo establecer una conexión TCP/IP habilitada para SSL en Ruby

Necesito enviar un archivo XML y obtener la respuesta del servidor.

Antes de habilitar SSL, pude obtener los datos del servidor utilizando el código mencionado a continuación.

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 

ahora tengo un 'certi.pfx' con la que necesito para establecer una conexión, enviar los datos my_xml y obtener la respuesta. ¿Cómo puede hacerse esto?

También me gustaría saber si tengo el archivo 'pem' y 'key', cómo puedo establecer una conexión, enviar datos my_xml y obtener la respuesta.

Por favor ayuda.

Respuesta

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

Hola, ¿qué debo hacer si no quiero cerrar el socket? – freeze

+0

Creo que puede eliminar la última línea ssl_socket.close esto mantendrá la conexión abierta. No estoy seguro exactamente –

3

De esta manera:

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

romanos - gracias por su respuesta. Pero una cosa es dónde debo especificar los archivos de certificado. En realidad, soy nuevo en la programación de socket. Cuando utilicé el código anterior, recibí un error como "connect: SSL_connect returned = 1 errno = 0 state = SSLv3 read server certificate B: certificate verify failed (OpenSSL :: SSL :: SSLError)" –

+0

Tengo un puerto específico 12482. Para lo cual necesito conectarme –

+0

. Necesita especificar el paquete ca (ca_path: '/ path', ca_file: 'ca-bundle.crt') y debe especificar el certificado (cert) en forma de PEM. Compruebe ri OpenSSL :: SSL :: SSLContext – Roman

Cuestiones relacionadas