Message d’erreur
error:05800074:x509 certificate routines::key values mismatch
Également affiché sous la forme
- x509 certificate routines:ossl_x509_check_private_key:key values mismatch
- [X509: KEY_VALUES_MISMATCH] key values mismatch
- code: 'ERR_OSSL_X509_KEY_VALUES_MISMATCH'
nginx -t la signale sous la forme « [emerg] SSL_CTX_use_PrivateKey(\"<key file>\") failed (SSL: error:05800074:x509 certificate routines::key values mismatch) » ; la CLI openssl ajoute le nom de la fonction (« x509 certificate routines:ossl_x509_check_private_key:key values mismatch ») ; Python affiche « [X509: KEY_VALUES_MISMATCH] key values mismatch » ; Node.js définit le code ERR_OSSL_X509_KEY_VALUES_MISMATCH. OpenSSL 1.1.1 utilisait le code 0B080074.
OpenSSL 3 — X509_R_KEY_VALUES_MISMATCH when loading a certificate with a private key (nginx, Node.js, Python, openssl s_server)
Ce que cela signifie
Un serveur TLS (ou une bibliothèque) a reçu un certificat et une clé privée qui ne vont pas ensemble : la clé publique contenue dans le certificat n’est pas la moitié publique de la clé privée. OpenSSL refuse de charger la paire, si bien que le serveur ne démarre pas ou que le contexte ne peut pas être créé. Pris isolément, aucun des deux fichiers ne présente de défaut.
Pourquoi cela se produit
Le certificat a été émis pour une clé plus récente (ou plus ancienne)
fréquenteLe renouvellement a créé une nouvelle clé et une nouvelle CSR, mais la configuration pointe toujours vers l’ancien fichier de clé, ou le nouveau certificat a été associé à la clé de l’année précédente.
Le bundle commence par le certificat intermédiaire, pas par le certificat feuille
fréquenteLes serveurs comparent la clé au premier certificat du fichier. Un fichier de chaîne dans l’ordre intermédiaire, feuille (ou qui commence par une racine) déclenche cette erreur, bien que le certificat feuille et la clé correspondent.
Des fichiers d’hôtes ou d’environnements différents ont été mélangés
occasionnelleCopier des certificats entre la préproduction et la production, ou entre plusieurs noms sur un même serveur, associe facilement un certificat à la clé d’un autre hôte.
Comment corriger l’erreur
- 1.
Comparer les clés publiques
Calculez le condensat de la clé publique extraite du certificat et celui de la clé publique dérivée de la clé privée ; des condensats identiques signifient qu’elles vont ensemble. Cela fonctionne de la même manière pour les clés RSA, EC et Ed25519.
bash # The two hashes must be identical openssl x509 -in server.pem -noout -pubkey | openssl sha256 openssl pkey -in server.key -pubout | openssl sha256 - 2.
Placer le certificat feuille en premier dans le bundle
Listez les sujets du bundle ; le certificat feuille de votre nom d’hôte doit venir en premier, suivi des certificats intermédiaires.
bash # Servers match the key against the FIRST certificate of the file: make it the leaf openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | grep subject= cat api.example.com.crt intermediate.crt > fullchain.pem - 3.
Trouver la clé correspondante parmi plusieurs
Comparez le condensat de la clé publique du certificat avec celui de chaque clé candidate ; si aucune ne correspond, la clé a été perdue et le certificat doit être réémis avec une nouvelle clé.
bash # Which of several keys belongs to the certificate? cert=$(openssl x509 -in server.pem -noout -pubkey | openssl sha256) for k in /etc/ssl/private/*.key; do [ "$(openssl pkey -in "$k" -pubout 2>/dev/null | openssl sha256)" = "$cert" ] && echo "match: $k" done