Pular para o conteúdo
ecdsa.com
OpenSSL CLI (openssl dgst -verify)CLI do OpenSSL

Mensagem de erro

Verification failure

Este é o texto do OpenSSL 3.x. O OpenSSL 1.1.x escreve com iniciais maiúsculas: “Verification Failure”. O openssl pkeyutl -verify imprime a variante “Signature Verification Failure”. No OpenSSL 3.x, as duas vêm acompanhadas de uma linha da pilha de erros, como “error:030000EA:digital envelope routines:EVP_DigestVerifyFinal:provider signature failure” (reproduzido no 3.6). Uma assinatura que nem sequer está em DER nunca chega até aqui: ela falha com “Error verifying data”.

O que significa

O openssl dgst -verify calculou o digest dos seus dados, verificou a assinatura com a chave pública, e a matemática disse não. Chave, dados e assinatura estavam todos legíveis — um dos três não corresponde aos outros dois. Para comparação, a saída em caso de sucesso é “Verified OK”.

Por que acontece

Como corrigir

  1. 1.

    Descartar primeiro a codificação da assinatura

    O dgst -verify só lê assinaturas ECDSA em ASN.1 DER. Uma assinatura raw r‖s do WebCrypto, de JWS ou de uma API Go/Python em modo raw — exatamente 64 bytes para P-256, 96 para P-384 — falha antes, com “Error verifying data”. Se a sua está em DER e ainda assim falha aqui, os dados, o digest ou a chave estão errados. A ferramenta DER ⇄ raw abaixo converte entre as duas formas e sinaliza valores high-S não canônicos, que verificadores rigorosos rejeitam.

  2. 2.

    Verificar um digest pré-calculado com o pkeyutl

    Quando você tem o digest, e não a mensagem, o dgst é a ferramenta errada (ele calcularia o hash de novo). O pkeyutl verifica a assinatura com o digest 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. 3.

    Eliminar divergências nos dados

    Compare os digests dos bytes exatos nos dois lados; qualquer diferença significa que quem mudou foi a mensagem, e não a criptografia.

    bash
    openssl dgst -sha256 message.bin       # run on signer and verifier sides
    xxd message.bin | tail -2                # check for a sneaky trailing 0a

Erros relacionados

Ver toda a base de erros de assinatura