Message d’erreur
verify error:num=19:self-signed certificate in certificate chain
Également affiché sous la forme
- verify error:num=19:self signed certificate in certificate chain
- error 19 at 2 depth lookup: self-signed certificate in certificate chain
OpenSSL 3.x affiche « self-signed », 1.1.1 « self signed ». openssl verify la signale sous la forme « error 19 at <depth> depth lookup: … », où la profondeur est la position de la racine dans la chaîne.
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
Ce que cela signifie
Erreur OpenSSL 19 (X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) : la chaîne a été construite jusqu’à un certificat racine auto-signé fourni par le pair, et cette racine ne figure pas dans le magasin de confiance. Contrairement à l’erreur 18, il existe une véritable hiérarchie d’AC ; contrairement à l’erreur 20, rien ne manque. Soit la racine doit être approuvée localement, soit la connexion est interceptée.
Pourquoi cela se produit
Un proxy d’inspection TLS
fréquenteLes proxys d’entreprise envoient leur propre racine dans la chaîne. Si le sujet du certificat le plus haut désigne votre entreprise ou un éditeur de solutions de sécurité, la connexion est inspectée.
Une AC privée dont la racine est envoyée par le serveur
fréquenteLes services internes envoient souvent la chaîne complète, racine comprise ; les clients doivent tout de même avoir la racine installée comme ancre de confiance.
Le test s’est exécuté sans le magasin de confiance attendu
occasionnelleUn test avec -CAfile pointant vers le mauvais fichier, ou dans une image dont le magasin ne contient pas la racine de l’entreprise, produit ce code pour un service interne correctement configuré.
Comment corriger l’erreur
- 1.
Identifier la racine et son empreinte
Découpez la chaîne servie et affichez le sujet, l’émetteur et l’empreinte SHA-256 de chaque certificat ; comparez l’empreinte de la racine avec celle que publie votre équipe informatique ou PKI.
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.
Tester avec la bonne racine, puis l’installer
Si -CAfile avec la racine publiée donne « Verify return code: 0 (ok) », installez cette racine dans le magasin du système.
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.
Propriétaires de serveurs : n’envoyer que le certificat feuille et les intermédiaires
Envoyer la racine gaspille des octets à chaque handshake et ne la rend jamais approuvée ; distribuez plutôt la racine aux clients.
bash # Server owners: the root does not belong in the served chain cat server.pem intermediate.pem > fullchain.pem
Erreurs associées
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