PDF 真正性検証
条文堂が生成した PDF が改竄されていないこと、確かに条文堂の鍵で署名されたことを誰でも検証できます。
仕組み
条文堂は生成した PDF それぞれに対して、運営が保持する Ed25519 秘密鍵 で detached signature (切り離し署名) を計算します。署名は次の場所で取得できます:
- ダッシュボード「生成履歴」 → 各ジョブの API レスポンス
pdf_signature_b64(base64 / 88 文字) - Box 連携で受け取った場合、PDF の隣に
<name>.pdf.sig(raw 64 バイト) が並んで配置
公開鍵は誰でも参照できます: /.well-known/jobundo-pubkey.pem
OpenSSL での検証
# 公開鍵を取得 curl -O https://jobundo.jp/.well-known/jobundo-pubkey.pem # Box から手に入れた場合 (PDF + 隣接の .sig) openssl pkeyutl -verify -pubin -inkey jobundo-pubkey.pem \ -rawin -in foo.pdf -sigfile foo.pdf.sig # 成功時: Signature Verified Successfully # 失敗時: Signature Verification Failure
Python での検証
from base64 import b64decode
from cryptography.hazmat.primitives.serialization import load_pem_public_key
from cryptography.exceptions import InvalidSignature
with open("jobundo-pubkey.pem", "rb") as f:
pub = load_pem_public_key(f.read())
with open("foo.pdf", "rb") as f:
data = f.read()
# A) .sig ファイルから (Box の場合)
with open("foo.pdf.sig", "rb") as f:
sig = f.read()
# B) ダッシュボード API の pdf_signature_b64 から
# sig = b64decode("<API レスポンスの pdf_signature_b64>")
try:
pub.verify(sig, data)
print("OK — 改竄されていません")
except InvalidSignature:
print("NG — 署名が一致しません (改竄 / 別ファイル / 鍵違い)")署名アルゴリズム
- 署名方式: Ed25519 (RFC 8032)
- 署名対象: PDF ファイル全体のバイト列 (ハッシュ計算は内部で実施)
- 署名長: 64 バイト (base64 で 88 文字)
- 公開鍵長: 32 バイト
注意事項
- 検証が成功すると「条文堂の秘密鍵で署名された PDF が、その後 1 バイトも 書き換えられていない」ことが暗号学的に保証されます。
- 検証が失敗する原因の例: PDF を編集ソフトで開いて再保存した / ダウンロード時にファイル破損 / 別の文書のものを取り違えた。
- 公開鍵が 万一 漏洩・ローテーションされた場合は、 上記 URL に新しい鍵が掲示されます。
質問は jobundo-support@jobundo.jp まで。