電子契約サービスで締結した契約書や、電子署名付きの請求書PDF。Adobe Acrobat Readerで開くと「署名は有効です」や「少なくとも1つの署名に問題があります」と表示されますが、その意味をきちんと説明できる人は意外と少ないです。この記事では、PDF署名の仕組みと、手元で検証するときに見るべきポイントを整理します。
PDF署名の仕組み:ByteRange
PDFの電子署名(PAdES / PKCS#7)は、ファイル全体ではなく「署名値を入れる穴を除いたバイト列」に対して計算されます。署名辞書の /ByteRange [0 840 960 24000] は、「0〜840バイト目と、960〜24960バイト目をハッシュした」という意味です。間の部分に署名値(CMS)が入ります。
検証では次を行います。
- ByteRangeで示されたバイト列をハッシュする
- CMS内に記録されたハッシュと一致するか比較する
- 署名者の証明書の公開鍵で、署名値を検証する
1と2が一致すれば「署名時点から、その範囲は変更されていない」と言えます。
「署名後に変更されています」の正体
PDFは「増分更新」で、元のバイト列の後ろに変更を追記できます。署名後にフォーム入力やコメントが追加されると、ByteRangeの外側にデータが増えます。
- 後ろに追加されたのが別の署名だけなら、複数人の署名として正常
- ページ内容やフォーム値の変更なら、署名済みの版とは異なる文書
多くのビューアは古い版に対する署名を「有効」と表示し続けるので、「有効」でも最終版が署名されたものとは限りません。
「改ざんなし」と「法的に有効」は別
ハッシュが一致しても、それは「文書が変わっていない」「証明書の鍵で署名された」ことの証明にすぎません。
- 証明書が信頼された認証局のものか(トラストリスト)
- 署名時点で失効していなかったか(CRL / OCSP)
- タイムスタンプ(RFC 3161)があるか
これらはオンラインでの照会が必要で、法的な有効性の判断には電子契約サービスや公的な検証サービスを使います。
ブラウザで手早く確認する
まず「改ざんの有無」だけ確かめたい場合は、Nibbo の PDF署名検証 が手軽です。各署名のByteRangeをハッシュしてCMS内の値と比較し、署名検証はブラウザのWebCrypto(PKI.js)で行います。署名者の証明書、署名時刻、タイムスタンプ、署名後の追記が「署名の追加だけ」か「内容の変更」かも表示されます。契約書がサーバーに送られないので、社外秘の文書でも試せます。
チェックリスト
- 署名のByteRangeがファイル末尾までカバーしているか
- 署名後の追記がある場合、その中身は何か
- 証明書の発行者と有効期間
- タイムスタンプの有無
「有効」の一言の裏にある内容を知っておくと、契約トラブルのときに慌てずに済みます。
— Vitalii