Mensagem de erro
verify error:num=19:self-signed certificate in certificate chain
Também aparece como
- verify error:num=19:self signed certificate in certificate chain
- error 19 at 2 depth lookup: self-signed certificate in certificate chain
O OpenSSL 3.x imprime “self-signed”; o 1.1.1, “self signed”. O openssl verify informa o erro como “error 19 at <depth> depth lookup: …”, em que a profundidade é a posição da raiz na cadeia.
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
O que significa
Erro 19 do OpenSSL (X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN): a cadeia foi montada até um certificado raiz autoassinado que veio do peer, e essa raiz não está no trust store. Ao contrário do erro 18, existe uma hierarquia de CAs real; ao contrário do erro 20, não falta nada. É preciso confiar na raiz localmente — ou então a conexão está sendo interceptada.
Por que acontece
Um proxy com inspeção de TLS
comumProxies corporativos enviam a própria raiz na cadeia. Se o titular do certificado do topo traz o nome da sua empresa ou de um fornecedor de segurança, a conexão está sendo inspecionada.
Uma CA privada cuja raiz é enviada pelo servidor
comumServiços internos costumam enviar a cadeia completa, inclusive a raiz; mesmo assim, os clientes precisam ter a raiz instalada como âncora de confiança.
O teste foi executado sem o trust store esperado
ocasionalTestar com -CAfile apontando para o arquivo errado, ou em uma imagem cujo trust store não tem a raiz da empresa, produz este código para um serviço interno configurado corretamente.
Como corrigir
- 1.
Identificar a raiz e a impressão digital dela
Separe a cadeia servida e imprima o titular, o emissor e a impressão digital SHA-256 de cada certificado; compare a impressão digital da raiz com a que a sua equipe de TI ou de PKI publica.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | awk '/BEGIN CERT/{n++} {print > ("cert" n ".pem")}' for f in cert[0-9]*.pem; do openssl x509 -in "$f" -noout -subject -issuer -fingerprint -sha256 2>/dev/null; done - 2.
Testar com a raiz correta e, depois, instalá-la
Se o -CAfile com a raiz publicada resultar em “Verify return code: 0 (ok)”, instale essa raiz no repositório do sistema.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com \ -CAfile corp-root-ca.pem 2>&1 | grep 'Verify return code' sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates - 3.
Donos do servidor: enviar só o certificado folha e os intermediários
Enviar a raiz desperdiça bytes em todo handshake e nunca a torna confiável; em vez disso, distribua a raiz aos clientes.
bash # Server owners: the root does not belong in the served chain cat server.pem intermediate.pem > fullchain.pem
Erros relacionados
verify error:num=18:self-signed certificateOpenSSL CLI (openssl s_client / openssl verify)verify error:num=20:unable to get local issuer certificateOpenSSL CLI (openssl s_client / openssl verify)curl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)self-signed certificate in certificate chainNode.js tls / https / fetch