Estoy intentando crear un servidor SSL simple y servidor en Ruby. Pero recibo un mensaje de error críptico y la documentación no es de ayuda.Intentando crear un servidor simple de Ruby sobre SSL
Aquí está mi código de servidor:
#!/usr/bin/ruby
require "gserver"
require "openssl"
listeningPort = Integer(ARGV[0])
class Server < GServer
def initialize(listeningPort)
@sslContext = OpenSSL::SSL::SSLContext.new
@sslContext.cert = OpenSSL::X509::Certificate.new(File.open("MyCert.pem"))
super(listeningPort, "0.0.0.0")
end
def serve(io)
begin
ssl = OpenSSL::SSL::SSLSocket.new(io, @sslContext)
ssl.sync_close = true
ssl.connect
while (lineIn = ssl.gets)
lineIn = lineIn.chomp
$stdout.puts "=> " + lineIn
lineOut = "You said: " + lineIn
$stdout.puts "<= " + lineOut
ssl.puts lineOut
end
rescue
$stderr.puts $!
end
end
end
server = Server.new(listeningPort)
server.start
server.join
El código de cliente es similar:
#!/usr/bin/ruby
require "socket"
require "thread"
require "openssl"
host = ARGV[0]
port = Integer(ARGV[1])
socket = TCPSocket.new(host, port)
sslContext = OpenSSL::SSL::SSLContext.new
sslContext.cert = OpenSSL::X509::Certificate.new(File.open("MyCert.pem"))
ssl = OpenSSL::SSL::SSLSocket.new(socket, sslContext)
ssl.sync_close = true
ssl.connect
puts ssl.peer_cert # this is nil
Thread.new {
begin
while lineIn = ssl.gets
lineIn = lineIn.chomp
$stdout.puts lineIn
end
rescue
$stderr.puts "Error in input loop: " + $!
end
}
while (lineOut = $stdin.gets)
lineOut = lineOut.chomp
ssl.puts lineOut
end
Cuando conecto, consigo este error en el servidor y el cliente:
in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol (OpenSSL::SSL::SSLError)
El problema podría ser que no confía en el certificado (autofirmado). No estoy seguro de cómo decirle al cliente que confíe en ese certificado. Arriba, he puesto el certificado del servidor en el contexto, pero eso fue solo una oportunidad en la oscuridad. Ni siquiera estoy seguro de que mi certificado esté en un formato aceptable (está en base64 con el certificado y la clave privada en el archivo). La documentación es muy escasa y tampoco parece haber mucho en la web en esta área.
¿Alguna idea?
Ahh, esto ayuda: http://stackoverflow.com/questions/4730544/ruby-openssl-documentation – Fantius