Pular para o conteúdo
ecdsa.com
OpenSSL CLI (openssl s_client / openssl verify)CLI do OpenSSL

Mensagem de erro

verify error:num=18:self-signed certificate

Também aparece como

  • verify error:num=18:self signed certificate
  • Verify return code: 18 (self-signed certificate)
  • error 18 at 0 depth lookup: self-signed certificate

O OpenSSL 3.x imprime “self-signed”; o 1.1.1, “self signed”. O s_client mostra “verify error:num=18:…” e “Verify return code: 18 (…)”; o openssl verify mostra “error 18 at 0 depth lookup: …”.

OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT

O que significa

Erro 18 do OpenSSL (X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT): o certificado na profundidade 0 é autoassinado — o emissor dele é ele mesmo — e ele não está no trust store. Não há CA acima dele, então nenhum intermediário ou bundle resolve; é preciso confiar diretamente no certificado ou substituí-lo por um emitido por uma CA.

Por que acontece

Como corrigir

  1. 1.

    Confirmar que o titular e o emissor são idênticos

    Se o titular for igual ao emissor, o certificado é autoassinado; o que você compara com o valor esperado é a impressão digital dele.

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -subject -issuer -fingerprint -sha256
    # subject == issuer: self-signed
  2. 2.

    Confiar exatamente nesse certificado para testes

    Usar o próprio certificado como -CAfile faz o OpenSSL aceitar exatamente esse certificado. Antes, confirme a impressão digital por um canal confiável.

    bash
    # Trust this exact certificate for a check (after confirming the fingerprint out of band)
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -out api.pem
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com -CAfile api.pem 2>&1 | grep 'Verify return code'
  3. 3.

    Verificar uma raiz com ela mesma

    Uma raiz autoassinada só passa na verificação quando é a âncora de confiança: passe-a como -CAfile.

    bash
    # Verifying a root CA certificate itself needs the root as its own trust anchor
    openssl verify -CAfile root.pem root.pem      # root.pem: OK

Erros relacionados

Ver toda a base de erros de assinatura