Вашему клиенту необходим доступ к его
закрытый ключ.
Вам не нужен закрытый ключ для проверки сертификата сервера. Все, что вам нужно, это сам сертификат, который содержит открытый ключ. Только у сервера есть закрытый ключ. Хорошо описано здесь 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, постоянная валидации) и добавляете к нему четыре строки выше.
Надеюсь, это поможет.