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 update
brew upgrade openssl
rvm osx-ssl-certs update all
rvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)"
(У меня не было этой версии раньше)rvm requirements
crlrefresh 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 больше не удалось.