Pular para o conteúdo
ecdsa.com
GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)curl

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

Como corrigir

  1. 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. 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. 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. 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. 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

Ver toda a base de erros de assinatura