Message d’erreur
Verification failure
Formulation d’OpenSSL 3.x. OpenSSL 1.1.x l’écrit avec des majuscules : « Verification Failure ». openssl pkeyutl -verify affiche le message voisin « Signature Verification Failure ». Sous OpenSSL 3.x, les deux sont accompagnés d’une ligne de la pile d’erreurs telle que « error:030000EA:digital envelope routines:EVP_DigestVerifyFinal:provider signature failure » (reproduit avec 3.6). Une signature qui n’est pas du tout en DER n’arrive jamais jusque-là : elle provoque « Error verifying data ».
Ce que cela signifie
openssl dgst -verify a calculé le condensat de vos données, vérifié la signature avec la clé publique, et les mathématiques ont répondu non. La clé, les données et la signature étaient toutes lisibles : l’un des trois éléments ne va pas avec les deux autres. Pour comparaison, la sortie en cas de succès est « Verified OK ».
Pourquoi cela se produit
Les données diffèrent de ce qui a été signé
fréquenteUn saut de ligne final ajouté par un éditeur, une conversion CRLF/LF effectuée par git, ou le hachage d’un condensat déjà haché (dgst hache son entrée : lui fournir un condensat SHA-256 revient à signer le condensat du condensat).
Discordance de condensat
fréquenteSigné avec -sha256 mais vérifié avec -sha384 (ou la bibliothèque du signataire a utilisé par défaut une autre fonction de hachage). Le condensat fait partie de ce qui est signé ; les deux parties doivent utiliser le même.
Mauvaise clé publique
occasionnelleUne clé renouvelée, la clé d’un autre service, ou une clé publique dérivée d’une autre clé privée que celle qui a signé.
Comment corriger l’erreur
- 1.
Écarter d’abord l’encodage de la signature
dgst -verify ne lit les signatures ECDSA qu’en ASN.1 DER. Une signature brute r‖s issue de WebCrypto, de JWS ou d’une API Go/Python en mode brut (exactement 64 octets pour P-256, 96 pour P-384) échoue plus tôt, sur « Error verifying data ». Si la vôtre est en DER et échoue quand même ici, ce sont les données, le condensat ou la clé qui sont erronés. L’outil DER ⇄ brut ci-dessous convertit d’une forme à l’autre et signale les valeurs high-S non canoniques que les vérificateurs stricts rejettent.
- 2.
Vérifier un condensat précalculé avec pkeyutl
Lorsque vous disposez du condensat plutôt que du message, dgst n’est pas le bon outil (il hacherait de nouveau). pkeyutl effectue la vérification directement sur le condensat brut.
bash openssl dgst -sha256 -binary message.bin > msg.hash openssl pkeyutl -verify -pubin -inkey pub.pem \ -sigfile sig.der -in msg.hash -pkeyopt digest:sha256 - 3.
Éliminer les dérives de données
Comparez les condensats des octets exacts des deux côtés ; toute différence signifie que c’est le message qui a changé, et non la cryptographie.
bash openssl dgst -sha256 message.bin # run on signer and verifier sides xxd message.bin | tail -2 # check for a sneaky trailing 0a