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
O servidor usa um certificado autoassinado
comumServidores de desenvolvimento, appliances, interfaces de administração e serviços recém-instalados costumam começar com um certificado gerado automaticamente.
Um certificado padrão é servido para um nome desconhecido
ocasionalProxies reversos e ingresses respondem com um certificado padrão autoassinado a nomes para os quais não têm configuração; verifique o SNI e o roteamento.
openssl verify executado em um certificado raiz
ocasionalExecutar openssl verify root.pem sem -CAfile root.pem gera o erro 18 para qualquer raiz autoassinada, mesmo que ela seja válida.
Como corrigir
- 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.
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.
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