Mensagem de erro
state=error: certificate verify failed (self-signed certificate in certificate chain)
Também aparece como
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (self-signed certificate in certificate chain)
A mensagem completa é “SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain)”. Instalações do Ruby baseadas no OpenSSL 1.1.1 imprimem “self signed” sem o hífen.
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
O que significa
A cadeia do servidor termina em um certificado raiz autoassinado em que o OpenSSL do Ruby não confia. Com hosts públicos como rubygems.org, isso significa que um proxy com inspeção de TLS ou um antivírus está reassinando a conexão; com hosts internos, falta a raiz da empresa no repositório que o Ruby usa.
Por que acontece
Um proxy com inspeção de TLS
comumProxies corporativos reassinam rubygems.org, GitHub e APIs com a própria raiz; o repositório do OpenSSL do Ruby não a contém.
Um serviço interno com uma raiz privada na cadeia
comumO servidor envia a raiz, mas ela não está instalada no cliente.
O Ruby usa um bundle diferente daquele do sistema
ocasionalInstalações do Ruby feitas com rbenv/asdf sobre o OpenSSL do Homebrew, ou com o RubyInstaller no Windows, usam o próprio bundle de CAs.
Como corrigir
- 1.
Identificar a raiz
Imprima a cadeia de um host público; uma raiz com o nome da sua empresa ou de um fornecedor de segurança é a raiz em que você deve confiar.
bash openssl s_client -connect rubygems.org:443 -servername rubygems.org -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Apontar SSL_CERT_FILE para um bundle combinado
Combine as raízes públicas com a raiz do proxy, porque SSL_CERT_FILE substitui o bundle padrão.
bash # Public roots + the proxy root in one bundle cat /etc/ssl/certs/ca-certificates.crt corp-proxy-root.pem > ~/.config/corp-ca-bundle.pem export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem - 3.
Instalar a raiz em todo o sistema (Linux)
Instalações do Ruby vinculadas ao OpenSSL do sistema passam a usar a raiz depois do update-ca-certificates.
bash sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates
Erros relacionados
state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)Could not verify the SSL certificate for https://gems.example.com/.Bundlercurl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)