Подтвердить что ты не робот

Подключение с помощью https к серверу с сертификатом, подписанным CA, который я создал

У меня есть тестовая среда, которая использует 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)

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

Используемый мной код:

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?

4b9b3361

Ответ 1

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

http.ssl_version = :TLSv1

или

http.ssl_version = :SSLv3

и посмотрите, помогает ли это.

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

Ответ 2

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

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

Вышеупомянутый ответ, предоставленный тиснением, является правильным, но убедитесь, что сгенерированная ошибка 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-адресе.

Ответ 3

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

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