Message d’erreur
verify error:num=21:unable to verify the first certificate
Également affiché sous la forme
- Verify return code: 21 (unable to verify the first certificate)
Affichée par openssl s_client sous la forme « verify error:num=21:… » et « Verify return code: 21 (…) ». Node.js signale la même situation sous le nom UNABLE_TO_VERIFY_LEAF_SIGNATURE (« unable to verify the first certificate »).
OpenSSL CLI (openssl s_client) — X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
Ce que cela signifie
Erreur OpenSSL 21 (X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE) : la chaîne se compose d’un seul certificat, celui du serveur, et son émetteur est introuvable, si bien que même la signature du certificat feuille ne peut pas être vérifiée. s_client affiche généralement l’erreur 20 pour la profondeur 0 juste avant. Le remède se trouve presque toujours sur le serveur : il doit envoyer son certificat intermédiaire.
Pourquoi cela se produit
Le serveur est configuré avec le seul certificat feuille
fréquentecert.pem au lieu de fullchain.pem, un certificat collé dans un répartiteur de charge sans sa chaîne, ou une entrée de keystore Java importée sans l’AC émettrice.
La chaîne est configurée mais pas envoyée
occasionnelleCertains serveurs attendent la chaîne dans une directive ou un champ distincts (SSLCertificateChainFile des anciennes versions d’Apache, le champ de chaîne d’un répartiteur de charge cloud) ; un bundle de certificats placé au mauvais endroit est ignoré silencieusement.
Le serveur envoie un certificat intermédiaire qui n’a pas émis le certificat feuille
occasionnelleAprès un changement de certificats intermédiaires chez l’AC, un ancien fichier de chaîne envoie un certificat qui n’est pas l’émetteur du certificat feuille ; OpenSSL ne peut alors pas l’utiliser.
Comment corriger l’erreur
- 1.
Vérifier ce qu’envoie le serveur
Un seul certificat dont l’émetteur (i:) est une AC intermédiaire confirme le problème.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Servir le certificat feuille + les intermédiaires
Concaténez dans l’ordre le certificat feuille et le ou les certificats intermédiaires émetteurs, puis configurez le serveur avec ce fichier ; affichez le bundle pour vérifier l’ordre.
bash # Build the file the server should use: leaf, then intermediates (issuer of each previous one) cat server.pem intermediate.pem > fullchain.pem openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout # check the order - 3.
Trouver le bon certificat intermédiaire
L’extension Authority Information Access du certificat feuille indique l’URL du certificat de son émetteur ; téléchargez-le, convertissez-le en PEM si nécessaire, puis ajoutez-le au fichier de chaîne.
bash # Where to download the missing intermediate: the leaf's Authority Information Access URL openssl x509 -in server.pem -noout -ext authorityInfoAccess curl -sS -o intermediate.der http://ca.example.com/issuing-ca.crt openssl x509 -inform der -in intermediate.der -out intermediate.pem