Использование самозаверяющего сертификата - PullRequest
7 голосов
/ 23 января 2010

Я просто пытаюсь разобраться с SSL.

Я установил сервер Jetty на своем локальном хосте и сгенерировал свой собственный сертификат, используя Keytool .

Теперь, когда я перехожу к https://localhost:8443/, я получаю сообщение "Не могу доверять этой ошибке сертификата".

Я использую

keytool -export -alias pongus -kystore keystore -file certfile.cer

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

У меня есть следующий код рубина:

require 'net/https'
require 'openssl'

require 'open-uri'

puts 'yay' if File.exists?('certfile.cer')

uri = URI.parse("https://localhost:8443/")
http_session = Net::HTTP.new(uri.host, uri.port)
http_session.use_ssl = true
http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER
http_session.ca_file = 'certfile.cer'
res = http_session.start do |http|
  # do some requests here
  http.get('/')
end

Это печатает 'yay', поэтому файл certfile.cer существует.

Но я получаю ошибки

/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586 warning: can't set verify locations
/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError)

Есть идеи, что я делаю не так?

EDIT

Я хочу получить его, поэтому я гарантирую, что я подключаюсь к нужному серверу, и сервер может гарантировать, что это я подключаюсь к нему, без вмешательства между ними. Я занимаюсь разработкой как сервера, так и клиента.

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Вашему клиенту необходим доступ к его закрытый ключ.

Вам не нужен закрытый ключ для проверки сертификата сервера. Все, что вам нужно, это сам сертификат, который содержит открытый ключ. Только у сервера есть закрытый ключ. Хорошо описано здесь http://www.helpbytes.co.uk/https.php и здесь http://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/

Моя рекомендация проста. Проверьте правильность вашего сертификата.

openssl x509 -text -in mycert.crt

Также, если у вас есть доступ к серверу, вы можете явно подтвердить, что сертификат и ключ (используемые в конфигурации httpd) верны (соответствует): http://kb.wisc.edu/middleware/page.php?id=4064 Обратите внимание, что это явная проверка, запущенная на сервере. Никогда не выдавай закрытый ключ. Эта проверка может быть выполнена только администратором, чтобы убедиться, что httpd не был неправильно настроен.

(openssl x509 -noout -modulus -in server.pem | openssl md5 ;\
   openssl rsa -noout -modulus -in server.key | openssl md5) | uniq

Вы также можете отлаживать связь SSL-сертификата с помощью стандартной команды openssl. Выполните эту команду, затем подождите несколько секунд, затем введите QUIT и нажмите Enter. Вы увидите сертификат, который отправляет сервер.

openssl s_client -connect your.server.com:443

Также попробуйте импортировать сертификат в браузер и получить доступ к ресурсу URL. Браузер может проверить его, нажав https (Firefox и Chrome). Тогда вы увидите сам сертификат и информацию о действительности.

Все вышеизложенное касалось сертификата сервера . Это только одна часть проблемы. « Я подключаюсь к нужному серверу , и сервер может гарантировать, что это я подключаюсь к нему» На самом деле в приведенном выше коде вы проверяете только сертификат сервера. Сейчас. Если вам нужен клиентский сертификат (вторая часть вашего заявления), тогда вам нужно это в Ruby:

File.open( "client_certificate.pem", 'rb' ) { |f| cert = f.read }
File.open( "client_key.pem", 'rb' ) { |f| key = f.read }
http_session.cert = OpenSSL::X509::Certificate.new(cert)
http_session.key = OpenSSL::PKey::RSA.new(key, nil)

Вот как сертификат клиента должен использоваться в Ruby. Если ваш закрытый ключ зашифрован паролем, просто передайте его вместо nil во втором аргументе конструктора RSA.

Я настоятельно рекомендую, чтобы сертификат сервера работал (ваш код), а затем начать с сертификата клиента. Обратите внимание, что вы сохраняете свой текущий код (ca_cert, постоянная валидации) и добавляете к нему четыре строки выше.

Надеюсь, это поможет.

0 голосов
/ 24 января 2010

Вашему клиенту необходим доступ к его секретному ключу. Закрытый ключ отсутствует в сертификате, сертификат содержит только открытый ключ. Извините, я не знаю ruby, но распространенным методом является объединение закрытого ключа и сертификата в один файл PKCS # 12, также известный как p12, и передача его в библиотеку шифрования.

0 голосов
/ 23 января 2010

Изменение

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

до

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE

Как только вы это сделаете, SSL будет работать правильно. Я использовал это несколько раз в своих средах разработки, всегда работает безупречно.

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