Ruby Net :: HTTP отвечает OpenSSL :: SSL :: SSLError «сбой проверки сертификата» после обновления сертификата

Недавно мы обновили SSL-сертификат нашего сайта, и в Mac OS El Capitan 10.11.3 происходит следующее:

require 'net/http'

Net::HTTP.get URI('https://www.google.com')
# => "<HTML>...</HTML>"

# The site whose certificate got renewed
Net::HTTP.get URI('https://www.example.com')
# => OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed

Все мои поиски в Google и StackOverflow дают ответы, указывающие на проблему с установкой Ruby, но, похоже, они связаны со старыми версиями Ruby, и я не думаю, что это так. Вот что я попробовал:

brew updatebrew upgrade opensslrvm osx-ssl-certs update allrvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)" (У меня не было этой версии раньше)rvm requirementscrlrefresh rpv очистить общесистемный кэш CRL OSX, согласно предложению Узбекджона.

Как я могу решить это?

Заметки:

Проблема не возникает в недавно установленном контейнере Docker Linux, на котором установлен Ruby 2.2.3. Так что, возможно, это как-то связано с Mac OS или локальным кэшированием SSL.Эта проблема могла существовать до обновления сертификата. Я не могу знать наверняка. Тем не менее, продление действительно вызвало аналогичную проблему с третьей стороной, которую мы используем, как я обсуждаю вэтот вопрос.Установка сертификата была проверена Namecheap на правильность, онлайн-проверки показывают, что все работает, и все основные браузеры показывают сертификат как действительный.Решение

С большой помощью BoraMa теперь ясно, что происходит. COMODO добавил новый рут с именемCOMODO RSA Certification Authority вместо предыдущегоCOMODO Certification Authority, Новый корень не был зарегистрирован в цепочке для ключей Mac, вызывая эту проблему.

Мы попытались отладить это одним из способов, выполнив:

openssl s_client -connect www.mysite.com:443

Который показал предупреждениеverify error:num=20:unable to get local issuer certificate, Это предупреждение не является проблемой, так какopenssl s_client не использует никаких сертификатов по умолчанию. Запуск следующих смог предотвратить предупреждение после загрузки сертификатаот COMODO вcomodo.pem (индексВот):

openssl s_client -connect www.mysite.com:443 -CAfile comodo.pem

Однако это не могло и не повлияло на интерфейс Ruby OpenSSL.Эта статья сделал вещи намного понятнее для меня, иSSL доктор сценарий Созданный его автором также был полезен, так как подтвердил гипотезу. В статье предлагается посмотреть наOpenSSL::X509::DEFAULT_CERT_FILEкоторый для меня был/usr/local/etc/openssl/cert.pem, Этот файл не существовал на моей машине, что означало, что патч Apple для OpendSSL использовал приложение Keychain. По какой-то причине, импортируяcomodo.pem в мой брелок и пометив его как доверенный на основеэта почта не работал.

Таким образом, решение было создатьcert.pem подать вручную. Я пошел в приложение связки ключей и экспортировал все сертификаты Корня системы вsystem_root.pem, Затем:cat system_root.pem comodo.pem > cert.pem и переместить этот файл в/usr/local/etc/openssl/ сделал свое дело. БегNet::HTTP.get в Ruby больше не удалось.

Ответы на вопрос(3)

Ваш ответ на вопрос