本文へスキップ
ecdsa.com
OpenSSL CLI (openssl dgst -verify)OpenSSL CLI

エラーメッセージ

Verification failure

OpenSSL 3.x での表記です。OpenSSL 1.1.x では「Verification Failure」と大文字で表記されます。openssl pkeyutl -verify は、類似の「Signature Verification Failure」を出力します。OpenSSL 3.x では、どちらにも「error:030000EA:digital envelope routines:EVP_DigestVerifyFinal:provider signature failure」のようなエラースタックの行が伴います(3.6 で再現)。そもそも DER ではない署名はここまで到達せず、「Error verifying data」というエラーになります。

このエラーの意味

openssl dgst -verify はデータのダイジェストを計算し、公開鍵で署名を検証しましたが、数学的に一致しませんでした。鍵、データ、署名はいずれも読み取れています。つまり、3 つのうち 1 つがほかの 2 つと対応していません。参考までに、成功時の出力は「Verified OK」です。

発生する理由

修正方法

  1. 1.

    まず署名のエンコーディングの問題を除外する

    dgst -verify は、ECDSA 署名を ASN.1 DER としてしか読み取りません。WebCrypto、JWS、Go や Python の API の「raw」モードが出力する生の r‖s 署名(P-256 ではちょうど 64 バイト、P-384 では 96 バイト)は、それより前の段階で「Error verifying data」というエラーになります。署名が DER なのにここで失敗する場合は、データ、ダイジェスト、鍵のいずれかが間違っています。下にある DER と生の形式の変換ツールは、2 つの形式を相互に変換し、厳格な検証者が拒否する非正規の high-S 値を指摘します。

  2. 2.

    ハッシュ化済みのダイジェストを pkeyutl で検証する

    手元にあるのがメッセージではなくダイジェストの場合、dgst は適切なツールではありません(再びハッシュ化してしまいます)。pkeyutl は、ダイジェストをそのまま使って検証します。

    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.

    データのずれをなくす

    双方が実際に扱っているバイト列そのもののダイジェストを比較してください。少しでも違いがあれば、変わったのは暗号処理ではなくメッセージです。

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

関連するエラー

署名エラーデータベースをすべて見る