2011-10-12 17 views
8

Heres il codice che sto usando per configurare il server:Verifica certificato client utilizzando SSLServer in 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 

E il client:

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 

Tuttavia, il server genera un'eccezione quando si tenta per ottenere il peer_cert che non riesce a trovare. C'è un modo per ottenere che SSLServer si aspetti un certificato client?

risposta

7

Dai un'occhiata a test_client_auth e start_server nelle prove per OpenSSL::SSL.

Dalla cima della mia testa, l'unica cosa che vedo manca nel codice è che si è dimenticato di richiedere esplicitamente l'autenticazione client sul lato server - è importante per impostare la combinazione di bandiera

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

così che il server in realtà richiede l'autenticazione del client e non accetta in modo silenzioso richieste non autenticate. Se non lo si imposta, il server sarà felice senza richiedere l'autenticazione del client e, di conseguenza, non sarà disponibile alcun certificato peer.

+1

Questo ha funzionato, grazie! – chrisbdaemon

+1

VERIFY_PEER significa anche che la verifica manuale nella domanda non è più necessaria? – Peeja

Problemi correlati