2011-10-12 21 views
8

Aquí está el código que estoy usando para configurar el servidor:verificar el certificado de cliente mediante SSLServer en Ruby

require 'socket' 
require 'openssl' 

socket = TCPServer.new('127.0.0.1', 4433) 

ssl_context = OpenSSL::SSL::SSLContext.new() 
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("ssl/server/server.crt")) 
ssl_context.key = OpenSSL::PKey::RSA.new(File.open("ssl/server/server.key")) 

ca_cert = OpenSSL::X509::Certificate.new(File.open("ssl/ca/ca.crt")) 

ssl_socket = OpenSSL::SSL::SSLServer.new(socket, ssl_context) 

Thread.start(ssl_socket.accept) do |s| 
    puts "Connected to #{s.peeraddr.last}" 

    if s.peer_cert.verify(ca_cert.public_key) 
     puts "Certificate verified" 
    else 
     puts "Certificate invalid" 
    end 
end 

y el cliente:

require 'socket' 
require 'openssl' 

socket = TCPSocket.new('127.0.0.1', 4433) 

ssl_context = OpenSSL::SSL::SSLContext.new 
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("ssl/client1/client1.crt")) 
ssl_context.key = OpenSSL::PKey::RSA.new(File.open("ssl/client1/client1.key")) 

ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context) 

ca_cert = OpenSSL::X509::Certificate.new(File.open("ssl/ca/ca.crt")) 

ssl_socket.connect 

if ssl_socket.peer_cert.verify(ca_cert.public_key) 
    puts "Certificate checks out" 
else 
    puts "Certificate not verified" 
end 

Sin embargo, el servidor inicia una excepción cuando se trata para obtener el peer_cert que no puede encontrar. ¿Hay alguna manera de hacer que SSLServer espere un certificado de cliente?

Respuesta

7

Eche un vistazo a test_client_auth y start_server en las pruebas de OpenSSL::SSL.

Desde lo alto de la cabeza, lo único que veo que falta en su código es que usted se olvidó de exigir explícitamente autenticación de cliente en el servidor - es importante para establecer la combinación de la bandera

flags = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT 
ctx.verify_mode = flags 

por lo que el servidor realmente requiere la autenticación del cliente y no acepta silenciosamente las solicitudes que no están autenticadas. Si no los configura, el servidor estará contento sin solicitar la autenticación del cliente y, como resultado, tampoco habrá un certificado de homólogo disponible.

+1

¡Eso lo hizo, gracias! – chrisbdaemon

+1

¿VERIFY_PEER también significa que la verificación manual en la pregunta ahora no es necesaria? – Peeja

Cuestiones relacionadas