Mensaje de error
Verification failure
Texto de OpenSSL 3.x. OpenSSL 1.1.x lo escribe con mayúsculas: «Verification Failure». openssl pkeyutl -verify imprime su variante hermana, «Signature Verification Failure». En OpenSSL 3.x, ambos mensajes van acompañados de una línea de la pila de errores como «error:030000EA:digital envelope routines:EVP_DigestVerifyFinal:provider signature failure» (reproducido en 3.6). Una firma que ni siquiera es DER nunca llega hasta aquí: falla con «Error verifying data».
Qué significa
openssl dgst -verify calculó el resumen de tus datos, comprobó la firma con la clave pública y las matemáticas dijeron que no. La clave, los datos y la firma se pudieron leer sin problemas: uno de los tres no corresponde a los otros dos. Como contraste, la salida en caso de éxito es «Verified OK».
Por qué ocurre
Los datos difieren de lo que se firmó
frecuenteUn salto de línea final añadido por un editor, la conversión entre CRLF y LF que hace git, o calcular otra vez el hash de un resumen ya calculado (dgst calcula el hash de su entrada: si le pasas un resumen SHA-256, se firma el hash del hash).
El resumen no coincide
frecuenteSe firmó con -sha256 pero se verificó con -sha384 (o la biblioteca del firmante usó por defecto otro hash). El resumen forma parte de la declaración firmada; ambos lados deben usar el mismo.
Clave pública incorrecta
ocasionalUna clave rotada, la clave de otro servicio o una clave pública derivada de una clave privada distinta de la que firmó.
Cómo solucionarlo
- 1.
Descartar primero la codificación de la firma
dgst -verify solo lee las firmas ECDSA en ASN.1 DER. Una firma r‖s en bruto de WebCrypto, de JWS o de una API de Go/Python en modo raw —exactamente 64 bytes para P-256 y 96 para P-384— falla antes, con «Error verifying data». Si la tuya es DER y aun así falla aquí, lo que está mal son los datos, el resumen o la clave. La herramienta DER ⇄ raw de abajo convierte entre ambas formas y señala los valores high-S no canónicos que rechazan los verificadores estrictos.
- 2.
Verificar con pkeyutl un resumen ya calculado
Cuando tienes el resumen y no el mensaje, dgst no es la herramienta adecuada (volvería a calcular el hash). pkeyutl verifica contra el resumen en bruto.
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.
Descartar cambios en los datos
Compara los resúmenes de los bytes exactos en ambos lados; cualquier diferencia significa que cambió el mensaje, no la criptografía.
bash openssl dgst -sha256 message.bin # run on signer and verifier sides xxd message.bin | tail -2 # check for a sneaky trailing 0a