2011-10-12 43 views
8

Heres mã Tôi đang sử dụng để thiết lập máy chủ:Xác nhận Giấy chứng nhận khách hàng sử dụng SSLServer trong 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 

Và khách hàng:

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 

Tuy nhiên, máy chủ ném một ngoại lệ khi nó cố gắng để có được peer_cert mà nó không thể tìm thấy. Có cách nào để nhận SSLServer để mong đợi chứng chỉ ứng dụng khách không?

Trả lời

7

Hãy xem test_client_authstart_server trong các thử nghiệm cho OpenSSL::SSL.

Từ đỉnh đầu của tôi, điều duy nhất tôi thấy thiếu trong mã của bạn là bạn quên đòi hỏi một cách rõ ràng xác thực khách hàng ở phía máy chủ - điều quan trọng là để thiết lập sự kết hợp cờ

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

nên rằng máy chủ thực sự sẽ yêu cầu yêu cầu xác thực ứng dụng khách và không chấp nhận âm thầm các yêu cầu không được xác thực. Nếu bạn không thiết lập các, máy chủ sẽ được hạnh phúc mà không yêu cầu xác thực khách hàng và kết quả là cũng sẽ không có chứng chỉ ngang hàng có sẵn.

+1

Điều đó đã làm điều đó, cảm ơn! – chrisbdaemon

+1

VERIFY_PEER cũng có nghĩa là xác minh thủ công trong câu hỏi hiện không cần thiết? – Peeja

Các vấn đề liên quan