Перейти к содержимому
ecdsa.com
BundlerМенеджеры пакетов

Сообщение об ошибке

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 не указано иное.

Почему это происходит

Как исправить

  1. 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. 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. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей