Saltar al contenido
ecdsa.com
Go crypto/x509Go

Mensaje de error

x509: certificate signed by unknown authority

Go crypto/x509 — returned by Certificate.Verify and TLS dials

Qué significa

Go intentó construir una cadena desde el certificado del servidor hasta una raíz de confianza y no lo consiguió: ninguna ruta termina en un certificado del pool de raíces configurado. Puede que el certificado sea perfectamente válido; simplemente, Go no tiene motivos para confiar en su emisor. Es el error TLS más frecuente en los despliegues de Go.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Añadir la CA al pool de raíces del cliente

    Amplía el pool del sistema en lugar de sustituirlo, para que los sitios públicos sigan funcionando junto con tu CA interna.

    go
    roots, err := x509.SystemCertPool()
    if err != nil { roots = x509.NewCertPool() }
    pem, _ := os.ReadFile("internal-ca.pem")
    roots.AppendCertsFromPEM(pem)
    
    client := &http.Client{Transport: &http.Transport{
        TLSClientConfig: &tls.Config{RootCAs: roots},
    }}
  2. 2.

    Corregir el servidor: servir la cadena completa

    Comprueba qué envía realmente el servidor; si solo aparece un certificado, configura el servidor para que use el archivo de cadena completa (por ejemplo, el fullchain.pem de Let's Encrypt).

    bash
    openssl s_client -connect api.example.com:443 -showcerts </dev/null \
      | grep -c "BEGIN CERTIFICATE"   # 1 = leaf only (broken), 2+ = chain present
  3. 3.

    Incluir los certificados de CA en la imagen

    En las imágenes mínimas, copia un bundle de CA durante la compilación. Nunca lo «resuelvas» con InsecureSkipVerify: eso desactiva la verificación por completo.

    docker
    FROM alpine AS certs
    RUN apk add --no-cache ca-certificates
    
    FROM scratch
    COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

Errores relacionados

Explorar toda la base de datos de errores de firma