Проверьте сертификат клиента, используя SSLServer в Ruby - PullRequest
9 голосов
/ 12 октября 2011

Вот код, который я использую для настройки сервера:

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

И клиент:

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

Однако сервер выдает исключение, когда пытается получитьpeer_cert, что он не может найти.Есть ли способ заставить SSLServer ожидать сертификат клиента?

1 Ответ

8 голосов
/ 12 октября 2011

Посмотрите на test_client_auth и start_server в тестах на OpenSSL::SSL.

Из головы видно, что в вашем коде отсутствует только то, что вы забыли явно требовать аутентификацию клиента на стороне сервера - важно установить комбинацию флагов

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

, так что сервер на самом деле потребует аутентификации клиента и не будет молча принимать запросы, которые приходят без аутентификации. Если вы не установите их, сервер будет счастлив без запроса аутентификации клиента, и в результате также не будет доступного сертификата однорангового узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...