Руби нетто::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 на моем рабочем столе (некоторые инструкции говорят, чтобы использовать