Руби нетто::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, по предложению Uzbekjon.
как я могу решить это?
Примечания:
- проблема не возникает на недавно установленном контейнере Linux Docker, который имеет голый Ruby 2.2.3. Так возможно, это связано с Mac OS или локальным кэшированием SSL.
- эта проблема могла существовать до обновления сертификата. Я не могу знать наверняка. Однако обновление вызвало аналогичную проблему с третьей стороной, которую мы используем, как я обсуждаю в этот вопрос.
- установка сертификата была проверена Namecheap, чтобы быть правильной, онлайн-шашки показывают, что все работает, и все основные браузеры показывают сертификат как действительный.
решение
С большой помощью Борамы теперь ясно, что происходило. COMODO добавил новый корень под названием COMODO RSA 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
(index здесь):
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
в мой брелок и пометить его как доверенный на основе этот пост не работает.
Итак, решение состояло в том, чтобы создать вручную. Я пошел в приложение keychain и экспортировал все системные корневые сертификаты в system_root.pem
. Затем:cat system_root.pem comodo.pem > cert.pem
и переместите этот файл в /usr/local/etc/openssl/
сделал свое дело. Бег!--21--> в Ruby больше не удалось.
3 ответов
Я бы попытался дважды проверить доверенное хранилище сертификатов, если оно содержит COMODO_RSA_Certification_Authority.pem
сертификаты. В моей (Linux) установке сайт работает нормально, но когда я временно удаляю сертификат Comodo cert authority из магазина сертификатов, я получаю точно такую же ошибку, как и вы (в то время как в браузерах он все еще работает, поскольку у них есть свои собственные магазины сертификатов).
кстати, та же ошибка также распознается с помощью curl
поскольку он также использует тот же доверенный магазин сертификатов, что и ruby, поэтому вы может сначала убедиться, что сайт работает под завиток.
в linux магазин сертификатов обычно находится в /etc/ssl/certs
тогда как под OSX это, вероятно, должно быть /System/Library/OpenSSL
(см. в этой статье другие варианты).
вы должны увидеть что-то вроде следующего в каталоге магазина свиду:
root@apsara:/etc/ssl/certs$ ls -l | grep COMODO_RSA_Certification_Authority.pem
lrwxrwxrwx 1 root root 73 úno 28 10:24 COMODO_RSA_Certification_Authority.pem -> /usr/share/ca-certificates/mozilla/COMODO_RSA_Certification_Authority.crt
lrwxrwxrwx 1 root root 38 úno 28 10:24 d4c339cb.0 -> COMODO_RSA_Certification_Authority.pem
lrwxrwxrwx 1 root root 38 úno 28 10:24 d6325660.0 -> COMODO_RSA_Certification_Authority.pem
ниже приведен фрагмент некоторых атрибутов этого корневого сертификата CA:
$ openssl x509 -in COMODO_RSA_Certification_Authority.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d
Signature Algorithm: sha384WithRSAEncryption
Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority
Validity
Not Before: Jan 19 00:00:00 2010 GMT
Not After : Jan 18 23:59:59 2038 GMT
Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:91:e8:54:92:d2:0a:56:b1:ac:0d:24:dd:c5:cf:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Basic Constraints: critical
CA:TRUE
Signature Algorithm: sha384WithRSAEncryption
...
сертификат можно загрузить с Comodo здесь (индекс всех служб -здесь).
Подробнее: изучая его, выясняется, что на самом деле существуют две различные цепочки сертификации для сертификатов COMODO CA. Один, более старый, является одним с корневым CA, перечисленным выше. В более новой цепочке проверки используются сертификаты "внешнего корневого ЦС". данное сообщение на форуме поясняет далее, с конкретными инструкциями для OSX для маркировки эти сертификаты как доверенные.
похоже, проблема заключается в вашем кэше сертификатов OSX. Полагаю, вы обновили свои сертификаты до того, как истек срок действия старого?
попробуйте очистить кэш CRL системы OSX, выполнив эту команду:
crlrefresh rpv
# p - purges cache, r - refreshes them, v - run in verbose mode
это встроенный инструмент командной строки, который обновляет и поддерживает системный кэш CRL. Подробнее об этом читайте в его man
страницы (mand crlrefresh
).
я все утро вытаскивал волосы с этой ошибкой. Этот вопрос и ответ привел меня к решению, которое работает для меня. Я не добавляю здесь новую информацию, а только специфику того, что я сделал, если это пригодится кому-либо еще с этой ошибкой на платформе, подобной моей.
я использую:
Ubuntu 16.04
ruby 2.3.0
rails 4.2.7.1
HTTParty
я получаю доступ к API, защищенному сертификатом Comodo SSL. В моем коде, когда я попытался:
HTTParty.get(secured_url).tap{|response| puts response}
я:
SSL_connect returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLError)
я тоже использовал сценарий SSL doctor, упомянутый выше. Когда я запускал скрипт (подставляя мой фактический адрес сервера api для host
), у меня есть:
$ ruby doctor.rb host:443
/home/<redacted>/.rvm/rubies/ruby-2.3.0/bin/ruby (2.3.0-p0)
OpenSSL 1.0.2g 1 Mar 2016: /usr/lib/ssl
SSL_CERT_DIR=""
SSL_CERT_FILE=""
HEAD https://host:443
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
The server presented a certificate that could not be verified:
subject: <redacted>
issuer: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
error code 20: unable to get local issuer certificate
в отдельном терминале я зашел в свой каталог сертификатов:
$ cd /etc/ssl/certs
и сделал (используя COMODO_RSA_Organization_Validation_Secure_Server_CA
происходит от issuer
текст выше):
<redacted>:/etc/ssl/certs$ openssl x509 -in COMODO_RSA_Organization_Validation_Secure_Server_CA.pem -noout -text
Error opening Certificate COMODO_RSA_Organization_Validation_Secure_Server_CA.pem
140455648364184:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('COMODO_RSA_Organization_Validation_Secure_Server_CA.pem','r')
140455648364184:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
unable to load certificate
я пошел на сайт COMODO, где проверка организации COMODO RSA Secure Server CA pem находится. Я скопировал сертификат в новый файл с именем COMODO_RSA_Organization_Validation_Secure_Server_CA.crt
на моем рабочем столе (некоторые инструкции говорят, чтобы использовать