Подключение через https к серверу с сертификатом, подписанным центром сертификации, который я создал - PullRequest
12 голосов
/ 07 февраля 2012

У меня есть тестовая среда, которая использует Ruby для управления сервером через соединение https. Поскольку последние версии Ruby отказываются подключаться к серверу https с недействительным сертификатом (см. мой предыдущий вопрос ), и я хотел бы начать использовать более новую версию Ruby, я пытаюсь настроить действительный сертификат.

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

Я знаю, что Ruby не использует тот же магазин, что и браузер. Я использовал файл CA, доступный здесь , чтобы проверить подключение к другим (общедоступным) серверам (устанавливается с использованием метода Net::HTTP#ca_file=), и это также работает.

То, что я не могу заставить работать - это подключение Ruby к моему серверу с использованием моего сертификата. Я пробовал разные способы указать его на своем сертификате (включая добавление моего сертификата к файлу, указанному выше), и он всегда выдает ту же ошибку:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (OpenSSL::SSL::SSLError)

Что мне нужно сделать, чтобы убедить Руби принять мой сертификат и подключиться к моему серверу?

Код, который я использую:

require 'net/https'

uri = URI.parse("https://hostname/index.html")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = "My CA cert file"
request = Net::HTTP::Get.new(uri.path)
response = http.request(request)

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

Ответы [ 3 ]

20 голосов
/ 13 февраля 2012

Я предполагаю, что вашему Tomcat не нравится версия протокола, с которой Ruby пытается договориться. Ruby по умолчанию использует SSLv23 , но я слышал другие случаи, когда это было проблемой для веб-серверов на основе Java. Полученное сообщение об ошибке означает, что при установлении соединения и попытке прочитать ответ сервера произошла ошибка. Попробуйте добавить либо

http.ssl_version = :TLSv1

или

http.ssl_version = :SSLv3

и посмотрим, поможет ли это уже.

Если это еще не решило проблему, было бы очень интересно узнать, почему ваш сервер отклоняет попытку подключения. Попробуйте запустить Tomcat с -Djavax.net.debug=ssl и, пожалуйста, опубликуйте соответствующие части (информация о соединении, трассировка стека исключений), чтобы узнать, почему попытка не удалась.

2 голосов
/ 27 июля 2013

Я использую ruby ​​1.9.3 и столкнулся с той же ошибкой при использовании nokogiri для анализа некоторых безопасных URL.

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null)

Приведенный выше ответ, полученный с помощью emboss, является правильным, но убедитесь, что сгенерированная ошибка sslтот, который упомянут выше.Я следовал тому же самому и нашел решение, подобное приведенному ниже.

uri = URI(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :SSLv3
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
response = http.get(url)

Теперь в ответе анализируется правильный html для защищенного URL-адреса, который передается кодам в URL-адресе.

0 голосов
/ 13 февраля 2012

Убедитесь, что файл сертификата имеет формат PEM, а не CRT (поэтому в документации для Net :: HTTP в Ruby 1.9.3 написано).

Обновление похоже, документация не обновлена, Ruby 1.9.3 примет любой вид сертификата.

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