Mensagem de erro
Could not verify the SSL certificate for https://gems.example.com/.
Também aparece como
- Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://gems.example.com/.
O Bundler imprime “Retrying fetcher due to error (n/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for <source>.” a cada tentativa, seguido de “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.” A URL da fonte é a do seu Gemfile.
Bundler — Bundler::Fetcher::CertificateFailureError while fetching a gem source
O que significa
O Bundler não conseguiu verificar o certificado TLS de uma fonte de gems do Gemfile, tentou de novo e desistiu. Ele encapsula o erro de verificação do OpenSSL em Bundler::Fetcher::CertificateFailureError e acrescenta uma dica de que o sistema pode não ter os certificados de CA. Como no Ruby em geral, as CAs confiáveis são as do bundle do OpenSSL que este Ruby usa, a menos que a configuração ssl_ca_cert do Bundler diga outra coisa.
Por que acontece
Um servidor de gems privado com um certificado da empresa
comumGemfury, Artifactory, Nexus ou um servidor de gems auto-hospedado cuja CA não está no bundle que o Ruby usa (comum em imagens de CI).
Um proxy com inspeção de TLS na frente do rubygems.org
comumA raiz do proxy é confiável para os navegadores, pelo repositório do sistema operacional, mas não para o bundle do OpenSSL do Ruby.
Este Ruby usa o próprio bundle de CAs
ocasionalInstalações do Ruby compiladas com o OpenSSL do Homebrew ou com um OpenSSL embutido, e o RubyInstaller no Windows, não leem o repositório de certificados do sistema operacional.
Como corrigir
- 1.
Definir o ssl_ca_cert do Bundler
bundle config set ssl_ca_cert aponta o Bundler para um arquivo de CAs nas requisições que ele faz. No nosso teste, isso resolveu o erro na hora.
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.
Ou definir SSL_CERT_FILE
Essa variável de ambiente do OpenSSL vale igualmente para o Bundler, o RubyGems e o aplicativo; aponte-a para um bundle que também contenha as raízes públicas.
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.
Instalar a CA no repositório que o Ruby lê
Consulte OpenSSL::X509::DEFAULT_CERT_FILE para ver qual bundle é esse e adicione a raiz nele (no Debian e no Ubuntu, com 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 no .gemrc
O gem install tem uma configuração própria com a mesma finalidade.
yaml # ~/.gemrc — the same CA for "gem install" :ssl_ca_cert: /etc/ssl/private-ca/corp-root-ca.pem
Erros relacionados
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