Saltar al contenido
ecdsa.com
GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)curl

Mensaje de error

ERROR: The certificate of 'api.example.com' is not trusted.

También se muestra como

  • ERROR: The certificate of 'api.example.com' doesn't have a known issuer.

Solo las compilaciones de wget con GnuTLS imprimen este par de líneas. Las compilaciones con OpenSSL (Ubuntu 22.04 y posteriores, Alpine, el wget 1.x de Fedora) informan de la misma situación como «ERROR: cannot verify <host>'s certificate, issued by '…'» seguido de «Unable to locally verify the issuer's authority.»

Qué significa

GnuTLS, la biblioteca TLS con la que Debian compila wget, no pudo verificar el certificado del servidor, así que wget se niega a descargar. Esta primera línea es genérica; la que wget imprime justo después indica el motivo real, normalmente «doesn't have a known issuer» (no hay ruta hasta una raíz de confianza) o «has expired». wget termina con el código de salida 5 (fallo de verificación SSL).

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Leer la línea siguiente

    La segunda línea ERROR es el diagnóstico real. «doesn't have a known issuer» apunta a un problema de CA o de cadena; «has expired» e «is not yet activated», a las fechas; «owner does not match hostname», a una discrepancia de nombres.

    bash
    wget -O /dev/null https://api.example.com/ 2>&1 | grep '^ERROR'
    # ... is not trusted.
    # ... doesn't have a known issuer.   <- chain/CA problem
    # ... has expired.                   <- date problem
  2. 2.

    Indicar a wget en qué CA confiar

    --ca-certificate recibe un archivo PEM con uno o varios certificados de CA; ca_certificate en ~/.wgetrc o /etc/wgetrc lo hace permanente. --ca-directory funciona con un directorio de certificados indexado por hash.

    bash
    wget --ca-certificate=/opt/certs/corp-root-ca.pem https://api.example.com/
    
    # permanently, for this user or system-wide (/etc/wgetrc)
    echo 'ca_certificate = /opt/certs/corp-root-ca.pem' >> ~/.wgetrc
  3. 3.

    Instalar la CA en el bundle del sistema

    En Debian y Ubuntu, update-ca-certificates añade a /etc/ssl/certs/ca-certificates.crt los certificados con extensión .crt colocados en /usr/local/share/ca-certificates, y GnuTLS lee ese archivo de forma predeterminada.

    bash
    sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt
    sudo update-ca-certificates
    # minimal images: install the bundle first
    apt-get install -y --no-install-recommends ca-certificates
  4. 4.

    Propietarios de servidores: enviar la cadena completa

    Si en el handshake solo hay un certificado y su emisor es una CA intermedia, configura el servidor con el archivo de cadena completa.

    bash
    # Server side: count the certificates in the handshake (1 = leaf only)
    openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \
      | grep -c 'BEGIN CERTIFICATE'
  5. 5.

    Diagnóstico temporal: omitir la comprobación una sola vez

    --no-check-certificate muestra si falla algo más aparte de la confianza. Desactiva toda la verificación, así que un proxy o un atacante podría sustituir sin que lo notes lo que descargas; nunca lo uses para instaladores ni scripts.

    bash
    # Diagnostic only: proves the download works when trust is ignored
    wget --no-check-certificate -O /dev/null https://api.example.com/

Errores relacionados

Explorar toda la base de datos de errores de firma