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
El certificado procede de una CA privada
frecuenteLos certificados de empresa, de laboratorio y de Kubernetes se encadenan a raíces que no están en el bundle ca-certificates de Debian; GnuTLS lo notifica como un emisor desconocido.
El servidor no envía su certificado intermedio
frecuenteGnuTLS no descarga los intermedios que faltan. Un servidor configurado solo con el certificado hoja falla aquí aunque los navegadores, que guardan en caché y descargan los intermedios, muestren el sitio como seguro.
Un proxy que inspecciona TLS vuelve a firmar la conexión
ocasionalLos proxies corporativos presentan certificados emitidos por su propia raíz. Si esa raíz no está instalada en el bundle del sistema de este equipo (o contenedor), todas las descargas HTTPS fallan.
El sistema no tiene bundle de CA
ocasionalLas imágenes mínimas de Debian y Ubuntu no incluyen ca-certificates. En ese caso, incluso los sitios públicos más conocidos aparecen como «not trusted».
Cómo solucionarlo
- 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.
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.
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.
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.
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
ERROR: cannot verify api.example.com's certificate, issued by 'CN=Example Priva…GNU Wget built with OpenSSL (Ubuntu 22.04+, Alpine, RHEL/CentOS)ERROR: The certificate of 'api.example.com' has expired.GNU Wget built with GnuTLS (Debian)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)fatal: unable to access 'https://git.example.com/team/app.git/': server verific…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)