PAdES ベースラインのマッピング
PAdES は、ETSI EN 319 142 で標準化された PDF Advanced Electronic Signatures のプロファイル群です。これは 4 つのベースライン適合レベル(B-B、B-T、B-LT、B-LTA)を定義しており、上位レベルはそれぞれ下位レベルに要素を追加します。このページでは、これらのレベルを NextPDF が生成する内容に対応付けます。Core の機能範囲を Pro エディションおよび Enterprise エディションと区別して示します。このマッピングは振る舞いのレベルを対象とし、内部クラスではなくエンジンが出力する内容を説明します。
簡潔に言えば、NextPDF Core は B-B レベルおよび B-T レベルに準拠した署名構造を生成します。B-LT および B-LTA の生成パスは、Pro エディションおよび Enterprise エディションに含まれています。生成された署名が特定のレベルに適合しているものとして 受け入れられる かどうかは、検証者と、その検証者に設定されたトラストアンカーに依存します。生成側は、検証者に代わって適合性を保証することはできません。
インストール
「インストール」という見出しのセクションcomposer require nextpdf/core:^3概念的な概要
「概念的な概要」という見出しのセクションPDF のデジタル署名は、署名辞書の Contents エントリに格納される CMS SignedData 構造です。ByteRange 配列は、ダイジェストが対象とするバイト範囲を指定します(ISO 32000-2 §12.8.1)。CMS の SignerInfo は、content-type 属性および message-digest 属性を含む署名済み属性を保持します(RFC 5652 §5.3)。これらの属性に対するメッセージダイジェストは、§5.4 の手順で計算されます。PAdES は CAdES の属性モデルを取り入れ、それを PDF 署名辞書の内部に埋め込みます。
4 つのベースラインレベルは累積的です。
- B-B は、必須の署名済み属性を持つ基本署名を保持します。
- B-T は、署名値に対して計算された署名タイムスタンプ属性を追加します。タイムスタンプ属性は、タイムスタンプが付与された時点で署名が存在していたことを証明します(ETSI PAdES §5.4.3)。このトークンは、RFC 3161 のタイムスタンプ局によって生成されます(RFC 3161 §2.4.1)。
- B-LT は、Document Security Store に配置される長期検証用の素材(証明書、OCSP、CRL データ)を追加します(ETSI PAdES §6.2.2、ISO 32000-2 §12.8.4.3、および ETSI EN 319 142-2 §6.3 に記載された検証データの配置)。
- B-LTA は、長期間にわたって有効性を維持できるように、アーカイブ文書タイムスタンプを追加します(ETSI PAdES §6.2.2)。
4 つのレベルは厳密に累積的です。上位の各レベルは、下位レベルが保持していたすべてを引き継ぎ、新しい素材の層を 1 つだけ追加します。各ステップを提供する生成側のエディションは、遷移ラベルに示されています。
API サーフェス
「API サーフェス」という見出しのセクションレベルセレクターは SignatureLevel 列挙型であり、PAdES_B_B、PAdES_B_T、PAdES_B_LT、PAdES_B_LTA のケースを持ちます。その requiresTimestamp()、requiresDss()、requiresDocumentTimestamp()、isAvailableInEnvironment() メソッドは、レベルに必要な要素と、現在のランタイムがそれを満たせるかどうかを報告します。Core ディストリビューションでは、isAvailableInEnvironment() は B-B および B-T に対して true を返し、B-LT および B-LTA に対して false を返します。長期検証の生成側はランタイムで resolve(解決)される仕組みで、オープンソースパッケージには含まれていないため、B-LT および B-LTA に対しては false を返します。本番コードは、これらの内部型ではなく SignerInterface コントラクトを利用します。
レベルサポートマトリックス
「レベルサポートマトリックス」という見出しのセクション| レベル | 追加される内容 | Core エディション(nextpdf/core) | Pro / Enterprise エディション |
|---|---|---|---|
| B-B | 必須の署名済み属性を持つ基本署名 | 準拠した構造を生成。合成ゴールデンベースラインに対してテスト済み | 同一サーフェス |
| B-T | 署名値に対する署名タイムスタンプ | RFC 3161 タイムスタンプサービスが提供された場合に準拠した構造を生成 | 同一サーフェス |
| B-LT | Document Security Store 内の検証データ | 生成側は Core には含まれません。Enterprise パッケージなしで B-LT を選択するとフェイルクローズします | 生成側が同梱 |
| B-LTA | アーカイブ文書タイムスタンプ | 生成側は Core には含まれません。上記と同様にフェイルクローズします | 生成側が同梱 |
「準拠した構造を生成」とは、引用された条項に沿った構造の署名をエンジンが出力することを意味します。この構造は、プロジェクトの tests/Corpus/pades/ および tests/Golden/baselines/ アーティファクトによって検証されます。これは、外部の検証ツールがそのレベルとして出力を認証することを意味するものではありません。「適合性」セクションを参照してください。
コードサンプル — クイックスタート
「コードサンプル — クイックスタート」という見出しのセクション<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\SignerInterface;
/** * Sign a byte range with any SignerInterface implementation. * * @param SignerInterface $signer A Core or Premium signer. * @param string $byteRange The PDF byte range to sign. * * @return string Hex-encoded CMS SignedData for the PDF /Contents field. */function signByteRange(SignerInterface $signer, string $byteRange): string{ return $signer->sign($byteRange)->toHex();}この関数は、具象クラスではなく SignerInterface コントラクトに依存します。Core のソフトウェア署名者(B-B または B-T)と Premium の HSM 署名者は、いずれもこのコントラクトを満たします。エディションが変わっても、呼び出し側のコードは変更されません。
コードサンプル — 本番
「コードサンプル — 本番」という見出しのセクション<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Security\Signature\SignatureLevel;
/** * Resolve the highest baseline level the current runtime can produce. * * B-B and B-T are produced by the Core distribution. B-LT and B-LTA * require the Enterprise long-term-validation package; without it the * level reports unavailable so callers fail closed rather than emit a * structure that does not carry the validation material the level names. * * @return SignatureLevel The highest level available in this runtime. */function highestAvailableLevel(): SignatureLevel{ foreach ([ SignatureLevel::PAdES_B_LTA, SignatureLevel::PAdES_B_LT, SignatureLevel::PAdES_B_T, SignatureLevel::PAdES_B_B, ] as $level) { if ($level->isAvailableInEnvironment()) { return $level; } }
return SignatureLevel::PAdES_B_B;}isAvailableInEnvironment() は、追加パッケージなしで B-B および B-T に対して true を返します。Enterprise の長期検証パッケージがインストールされている場合に限り、B-LT および B-LTA に対して true を返します。明示的にデグレードを有効にしないまま利用できないレベルを選択すると、不足しているパッケージ名をメッセージで示す型付きの到達不能レベル例外がスローされます。したがって、設定を誤ったデプロイメントは、呼び出し側が要求したよりも低いレベルを暗黙のうちに出力するのではなく、フェイルクローズします。
エッジケースと注意点
「エッジケースと注意点」という見出しのセクション- 構造的に B-T である署名は、B-T として 検証された 署名と同義ではありません。検証は、その検証者のトラストアンカーと失効情報の鮮度を用いて、検証者側で実行されます。生成側はその結果を保証することはできません。
- PAdES B-LT および B-LTA には、NextPDF Enterprise パッケージ(
nextpdf/enterprise)が必要です。インストールされていない場合、署名者はフェイルクローズし、B-LT/B-LTA は利用できません。Core のサーフェスは、パブリックなNextPDF\Contracts\SignerInterfaceを通じて B-B/B-T を提供し、長期検証はLtvManagerInterfaceの背後に置かれます。Core ディストリビューションで利用できないレベルを選択すると、デフォルトでフェイルクローズします。型付きの例外は、内部型ではなく、不足しているパブリックパッケージ名を示します。下位レベルへの段階的なデグレードはオプトイン方式であり、デフォルトになることはありません。 - バイト範囲のダイジェストは、署名値を除外しなければなりません。
Contentsのオクテットも対象に含むダイジェストは、決して検証に成功しません(ISO 32000-2 §12.8.1)。 - B-T の署名タイムスタンプは、文書のバイトではなく署名値を対象とします。B-LTA のアーカイブタイムスタンプは、別個の文書タイムスタンプです。この 2 つは互換性がありません(ETSI PAdES §5.4.3 および §6.2.2)。
- ETSI EN 319 142-1(ベースラインレベルに関する部分)は、このプロジェクトのエビデンスコーパスには含まれていません。ここでのレベル構造に関する主張は、ETSI EN 319 142-2、
padesプロファイル文書、ISO 32000-2 §12.8、および RFC 5652 / RFC 3161 に基づいています。レベル 名 と累積的な構造は、v3.x で実装されたとおりに記載されています。適合性テストの結果や第三者による認証は、一切主張していません。
パフォーマンス
「パフォーマンス」という見出しのセクションレベルのコストは、レベルが上がるにつれて増加します。B-B は単一の署名処理であり、ソフトウェア鍵の場合は 1 桁ミリ秒で完了します。B-T は、タイムスタンプ局への 1 回のネットワーク往復を追加します。B-LT は、チェーン内の証明書ごとに 1 回の失効情報取得を追加します。B-LTA は、さらに文書タイムスタンプを 1 つ追加します。1500 ms の実行時間バジェットは、ウォーム状態の接続でリモート TSA を使用した単一の B-T 署名を対象とします。応答の遅い失効情報エンドポイントに対する B-LT または B-LTA はこれを超過するため、リクエストパスの外で処理すべきです。再現性プロファイルは structural であり、bitwise ではありません。タイムスタンプには署名の瞬間が埋め込まれます。そのため、2 回の実行ではタイムスタンプのバイトが異なりますが、文書構造は同一のままです。
セキュリティに関する注意事項
「セキュリティに関する注意事項」という見出しのセクション署名が主張するレベルと、署名が検証されるレベルは、別々の事実です。このページでは、生成側のサーフェスのみを説明します。長期検証は、署名時に検証データが収集されること、および後に検証者が同じアンカーを信頼することに依存します。いずれも、生成側が保証できるものではありません。タイムスタンプの信頼は、突き詰めればタイムスタンプ局への信頼に帰着します。デプロイメントは、注入可能なプロバイダーを介してこれを固定します。このページは暗号署名プロファイルに関わるため、export_control_class: legal-review-required とマークされています。引用衛生の方針に従い、すべての規範的な出典は言い換えられており、いずれも複製されていません。
| 主張 | 標準規格 | 条項 | エビデンス |
|---|---|---|---|
署名値は、署名辞書の Contents エントリに、CMS SignedData または TimeStampToken として DER エンコードで格納されます。 | ISO 32000-2 | §12.8.1 | |
ダイジェストは ByteRange の範囲に対して計算され、署名値は除外されます。 | ISO 32000-2 | §12.8.1 | |
| 署名タイムスタンプ属性は、署名値に対して計算されます(B-T)。 | ETSI PAdES (EN 319 142) | §5.4.3 | |
| 長期検証用の素材は、Document Security Store に保持されます(B-LT)。 | ETSI PAdES (EN 319 142) / ISO 32000-2 | §6.2.2 / §12.8.4.3 | , |
| 検証データは、DSS 辞書および VRI 辞書に配置されます。 | ETSI EN 319 142-2 | §6.3 | , |
| アーカイブ文書タイムスタンプは、長期間にわたって有効性を維持します(B-LTA)。 | ETSI PAdES (EN 319 142) | §6.2.2 | |
| SignerInfo は、content-type および message-digest の署名済み属性を保持します。 | RFC 5652 | §5.3 | |
| メッセージダイジェストは、DER エンコードされた署名済み属性に対して計算されます(§5.4 のプロセス)。 | RFC 5652 | §5.4 | |
| タイムスタンプは RFC 3161 の TSA に要求され、TSA は TSTInfo 構造を返します。 | RFC 3161 | §2.4.1 |
すべての条項は言い換えられています。NextPDF は規範的なテキストを複製しません。正式な文言については、公開されている標準規格を参照してください。ETSI EN 319 142-1 はエビデンスコーパスに含まれていません。ベースラインレベルに関する構造的な主張は、上記の出典に基づいており、v3.x で実装されたとおりに記載されています。
商用に関する背景
「商用に関する背景」という見出しのセクションCore は B-B および B-T の署名構造を生成します。B-LT および B-LTA の生成パス、HSM および PKCS#11 による鍵管理、そして FIPS 140-3 暗号ポリシープロファイルは、Pro エディションおよび Enterprise エディションに含まれています。Core は、長期検証の生成側をランタイムで解決します。したがって、オープンソースのエンジンは商用依存関係を持たず、SignerInterface API はアップグレード時に変更されません。
- Security / Signing — CMS、タイムスタンプ、LTV、トラストチェーン、失効に関する実装サーフェス。
- Contracts / Signing —
SignerInterfaceSPI と安定性階層。 - Security — 暗号化と署名の実装サーフェス。
- Conformance — 署名付きアーカイブと組み合わせる PDF/A とプロファイル適用。
- PAdES · PAdES B-T · DSS · CAdES — 用語集の項目。