Сообщение об ошибке
Could not verify the SSL certificate for https://gems.example.com/.
Также выводится как
- Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://gems.example.com/.
При каждой попытке Bundler выводит «Retrying fetcher due to error (n/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for <source>.», а после этого — «There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification.» URL источника — тот, что указан в Gemfile.
Bundler — Bundler::Fetcher::CertificateFailureError while fetching a gem source
Что это означает
Bundler не смог проверить TLS-сертификат источника гемов из Gemfile и после нескольких повторных попыток прекратил работу. Ошибку проверки OpenSSL он оборачивает в Bundler::Fetcher::CertificateFailureError и добавляет подсказку, что в системе, возможно, нет нужных сертификатов CA. Как и везде в Ruby, доверенными считаются CA из пакета сертификатов OpenSSL, которым пользуется этот Ruby, если в параметре ssl_ca_cert для Bundler не указано иное.
Почему это происходит
Частный сервер гемов с корпоративным сертификатом
частоGemfury, Artifactory, Nexus или собственный сервер гемов, чьего CA нет в пакете сертификатов, которым пользуется Ruby (частая ситуация в образах CI).
Прокси с инспекцией TLS перед rubygems.org
частоБраузеры доверяют корневому сертификату прокси через хранилище ОС, а в пакете сертификатов OpenSSL, которым пользуется Ruby, этого корневого сертификата нет.
Этот Ruby использует собственный пакет сертификатов CA
иногдаСборки Ruby, слинкованные с OpenSSL из Homebrew или со встроенным OpenSSL, а также RubyInstaller в Windows не читают хранилище сертификатов ОС.
Как исправить
- 1.
Задайте ssl_ca_cert в Bundler
Команда bundle config set ssl_ca_cert записывает в настройки Bundler файл CA, который тот использует при загрузке. В нашей проверке это сразу устранило ошибку.
bash # Trust a CA for Bundler (stored in .bundle/config; --global for ~/.bundle/config) bundle config set --local ssl_ca_cert /etc/ssl/private-ca/corp-root-ca.pem bundle install - 2.
Или задайте SSL_CERT_FILE
Эта переменная окружения OpenSSL одинаково действует на Bundler, RubyGems и само приложение; укажите в ней пакет сертификатов, в котором есть и публичные корневые сертификаты.
bash # Or for the whole process (Bundler, RubyGems and Net::HTTP) SSL_CERT_FILE=/etc/ssl/private-ca/corp-ca-bundle.pem bundle install - 3.
Установите CA в хранилище, из которого Ruby читает сертификаты
По OpenSSL::X509::DEFAULT_CERT_FILE узнайте, какой файл пакета сертификатов используется, и добавьте туда корневой сертификат (в Debian и Ubuntu — через update-ca-certificates).
bash sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE' # the bundle this Ruby reads - 4.
RubyGems: :ssl_ca_cert в .gemrc
У gem install есть собственный параметр с тем же назначением.
yaml # ~/.gemrc — the same CA for "gem install" :ssl_ca_cert: /etc/ssl/private-ca/corp-root-ca.pem
Связанные ошибки
state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)state=error: certificate verify failed (self-signed certificate in certificate…Ruby openssl (Net::HTTP, Faraday, RubyGems)npm error code UNABLE_TO_GET_ISSUER_CERT_LOCALLYnpm (Node.js)There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FA…pip