Mensagem de erro
ERROR: The certificate of 'api.example.com' is not trusted.
Também aparece como
- ERROR: The certificate of 'api.example.com' doesn't have a known issuer.
Só os builds do wget com GnuTLS imprimem este par de linhas. Builds com OpenSSL (Ubuntu 22.04 e posteriores, Alpine, o wget 1.x do Fedora) relatam a mesma situação como “ERROR: cannot verify <host>'s certificate, issued by '…'” seguido de “Unable to locally verify the issuer's authority.”
O que significa
O GnuTLS, a biblioteca TLS com que o Debian compila o wget, não conseguiu verificar o certificado do servidor, então o wget se recusa a fazer o download. Esta primeira linha é genérica; a linha que o wget imprime logo depois indica o motivo real, na maioria das vezes “doesn't have a known issuer” (não há caminho até uma raiz confiável) ou “has expired”. O wget sai com o código de saída 5 (falha na verificação SSL).
Por que acontece
O certificado vem de uma CA privada
comumCertificados de empresas, de laboratórios e do Kubernetes se encadeiam até raízes que não estão no bundle ca-certificates do Debian; o GnuTLS relata isso como emissor desconhecido.
O servidor não envia o certificado intermediário
comumO GnuTLS não baixa intermediários ausentes. Um servidor configurado só com o certificado folha falha aqui, mesmo que os navegadores, que guardam intermediários em cache e os buscam, mostrem o site como seguro.
Um proxy com inspeção de TLS reassina a conexão
ocasionalProxies corporativos apresentam certificados emitidos pela própria raiz. A menos que essa raiz esteja instalada no bundle do sistema desta máquina (ou contêiner), todo download HTTPS falha.
O sistema não tem bundle de CAs
ocasionalAs imagens mínimas do Debian e do Ubuntu não incluem o ca-certificates. Nesse caso, até sites públicos conhecidos aparecem como “not trusted”.
Como corrigir
- 1.
Ler a linha seguinte
A segunda linha de ERROR é o diagnóstico real. “doesn't have a known issuer” aponta para um problema de CA ou de cadeia; “has expired” e “is not yet activated”, para as datas; “owner does not match hostname”, para nomes que não correspondem.
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.
Dizer ao wget em qual CA confiar
O --ca-certificate recebe um arquivo PEM com um ou mais certificados de CA; ca_certificate em ~/.wgetrc ou /etc/wgetrc torna isso permanente. O --ca-directory funciona com um diretório 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 a CA no bundle do sistema
No Debian e no Ubuntu, o update-ca-certificates adiciona os certificados com a extensão .crt colocados em /usr/local/share/ca-certificates ao arquivo /etc/ssl/certs/ca-certificates.crt, que o GnuTLS lê por padrão.
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.
Donos do servidor: enviar a cadeia completa
Se só um certificado aparecer no handshake e o emissor dele for uma CA intermediária, configure o servidor com o arquivo da cadeia 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 temporário: pular a verificação uma única vez
O --no-check-certificate mostra se há algum outro problema além da confiança. Ele desativa toda a verificação, então um proxy ou um atacante poderia substituir silenciosamente o que você baixa; nunca o use para instaladores ou scripts.
bash # Diagnostic only: proves the download works when trust is ignored wget --no-check-certificate -O /dev/null https://api.example.com/
Erros 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)