Mensaje de error
state=error: certificate verify failed (self-signed certificate in certificate chain)
También se muestra 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)
El mensaje completo es «SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain)». Las versiones de Ruby basadas en OpenSSL 1.1.1 imprimen «self signed» sin el guion.
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
Qué significa
La cadena del servidor termina en un certificado raíz autofirmado en el que no confía el OpenSSL de Ruby. Con hosts públicos como rubygems.org, significa que un proxy que inspecciona TLS o un antivirus está volviendo a firmar la conexión; con hosts internos, falta la raíz de la empresa en el almacén que usa Ruby.
Por qué ocurre
Un proxy que inspecciona TLS
frecuenteLos proxies corporativos vuelven a firmar rubygems.org, GitHub y las API con su propia raíz; el almacén de OpenSSL de Ruby no la incluye.
Un servicio interno con una raíz privada en su cadena
frecuenteEl servidor envía la raíz, pero no está instalada en el cliente.
Ruby no usa el mismo bundle que el sistema
ocasionalLas instalaciones de Ruby hechas con rbenv/asdf sobre el OpenSSL de Homebrew, o con RubyInstaller en Windows, usan su propio bundle de CA.
Cómo solucionarlo
- 1.
Identificar la raíz
Imprime la cadena de un host público; la raíz que lleva el nombre de tu empresa o de un proveedor de seguridad es en la que hay que 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.
Apuntar SSL_CERT_FILE a un bundle combinado
Combina las raíces públicas con la raíz del proxy, porque SSL_CERT_FILE sustituye el bundle predeterminado.
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 la raíz en todo el sistema (Linux)
Las instalaciones de Ruby enlazadas con el OpenSSL del sistema incorporan el certificado raíz después de update-ca-certificates.
bash sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates
Errores 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)