エラーメッセージ
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 は Gemfile に記載された gem ソースの TLS 証明書を検証できず、再試行したうえで処理を断念しました。Bundler は OpenSSL の検証エラーを Bundler::Fetcher::CertificateFailureError でラップし、システムに CA 証明書が不足している可能性があるというヒントを付け加えます。Ruby 全般と同じく、信頼される CA は、Bundler の ssl_ca_cert 設定で別の指定をしない限り、この Ruby が使う OpenSSL のバンドルに含まれる CA です。
発生する理由
社内の証明書を使うプライベート gem サーバー
よくあるGemfury、Artifactory、Nexus、またはセルフホストの gem サーバーのうち、CA が Ruby の使うバンドルに含まれていないものです(CI イメージでよく見られます)。
rubygems.org の手前にある、TLS を検査するプロキシ
よくあるプロキシのルートは、ブラウザーでは OS のストアを通じて信頼されますが、Ruby の OpenSSL のバンドルでは信頼されません。
この Ruby が独自の CA バンドルを使っている
ときどきHomebrew の OpenSSL や同梱の OpenSSL を使ってビルドされた Ruby と、Windows の RubyInstaller は、OS の証明書ストアを読み込みません。
修正方法
- 1.
Bundler の ssl_ca_cert を設定する
bundle config set ssl_ca_cert で、Bundler が取得処理に使う CA ファイルを設定します。ecdsa.com のテストでは、これでエラーがすぐに解消しました。
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.
Ruby が読み込むストアに CA をインストールする
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:.gemrc の :ssl_ca_cert
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