Enterprise エディション
NextPDF Enterprise クイックスタート
このチュートリアルでは、空のプロジェクトから 2 つの動作する Enterprise の成果までを案内します。まず既存の署名済み PDF を検証し、その MainIndication を読み取ります。次に、長期保存プロデューサーを使って署名済みドキュメントを PAdES B-LT へと引き上げます。各ステップでは、期待される正確な出力または例外を示します。NextPDF は認証ではなく機能を文書化しています。PAdES や eIDAS の認証は保持しておらず、いかなる認証も付与しません。
この機能は NextPDF Enterprise(nextpdf/enterprise)に含まれ、Enterprise ティアのライセンスエンベロープでアクティベートされます。そのエンタイトルメントを持たないデプロイでは、この機能のクラスはロードされません。エディションを比較してライセンスを取得する。
- Composer がプライベート NextPDF リポジトリ用に設定されていること。まず インストールと認証 に従ってください。
- Enterprise ライセンスエンベロープ を、app.getnextpdf.com のアカウントからダウンロードして保有していること。ライセンスとアクティベーション では、エンベロープとは何か、どこに配置するのかを説明しています。
- ステップ 3 では検証対象の署名済み PDF が必要です。B-LT の部分では、署名者証明書と OCSP/CRL レスポンダーへのネットワークアクセスも必要です。
1. インストールとアクティベート
「1. インストールとアクティベート」という見出しのセクションEnterprise パッケージを要求します。これは nextpdf/core と nextpdf/pro に依存するため、Composer がスタック全体を取り込みます。
composer require nextpdf/enterprisecomposer show nextpdf/enterprisecomposer show がパッケージとそのバージョンを表示すれば、インストールは成功しています。次に、署名済みライセンスエンベロープを、ライセンスとアクティベーション の説明どおりに、デプロイがロードする場所へ配置します。パッケージのインストールだけでは Enterprise 機能は付与されません。アクティベートされたライセンスがエディションを選択します。
2. エンタイトルメントを確認する
「2. エンタイトルメントを確認する」という見出しのセクションエンタイトルメント評価器に、ライセンスが何を付与しているかを問い合わせます。ブートストラップはアクティベーション時に検証済みの NextPDF\Enterprise\Licensing\LicenseKey を取得します。それを渡してください。
<?phprequire __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Licensing\EntitlementEvaluator;use NextPDF\Enterprise\Licensing\LicenseKey;
/** @var LicenseKey|null $license The verified license from activation. */$result = (new EntitlementEvaluator())->evaluate($license);
echo 'status: ' . $result->status->value . PHP_EOL;echo 'edition: ' . ($result->edition?->value ?? 'none') . PHP_EOL;echo 'runtime: ' . ($result->runtimeAllowed ? 'allowed' : 'disabled') . PHP_EOL;有効な Enterprise ライセンスがあれば、次のように表示されます。
status: activeedition: enterpriseruntime: allowedこのステップの背後にあるメソッド。
public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResultスローまたは失敗する条件: このメソッドは決してスローしません。ライセンスが存在しない場合は、EntitlementStatus::NoLicense と runtimeAllowed が false のフェイルクローズな EntitlementResult を返します(ステップ 4 を参照)。
3. 最初の成果
「3. 最初の成果」という見出しのセクション既存の署名済み PDF を検証する
「既存の署名済み PDF を検証する」という見出しのセクション署名済み PDF から署名を抽出し、基本的な AdES 検証を実行します。このエンジンは ETSI EN 319 102-1 の検証レベルを実装しています。validateBasic() はクラウス 5.2 のフロー、すなわち構造、ダイジェスト、署名の暗号処理、および証明書チェーンを扱います。
<?phprequire __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Security\Validation\AdESValidationEngine;use NextPDF\Enterprise\Security\Validation\CmsSignatureDataExtractor;use NextPDF\Enterprise\Signature\SignatureExtractor;
$pdf = file_get_contents(__DIR__ . '/contract-signed.pdf');if ($pdf === false) { throw new RuntimeException('Could not read contract-signed.pdf');}
$signatures = (new SignatureExtractor())->extract($pdf);if ($signatures === []) { throw new RuntimeException('The PDF carries no signature dictionary.');}
$engine = new AdESValidationEngine(extractor: new CmsSignatureDataExtractor());$report = $engine->validateBasic( $signatures[0]['signedBytes'], // the exact /ByteRange-covered bytes $signatures[0]['contents'], // the DER CMS SignedData from /Contents);
echo $report->mainIndication->name . PHP_EOL;echo ($report->subIndication?->name ?? '(none)') . PHP_EOL;この例で設定された基本的な構造・ダイジェスト・暗号処理・チェーンの各チェックに合格する適切に構成された署名の場合、次のように表示されます。
TOTAL_PASSED(none)MainIndication はちょうど 3 つのケースを持ちます。TOTAL_PASSED、TOTAL_FAILED、INDETERMINATE です。エンジンはフェイルクローズです。積極的に確定できないチェックは INDETERMINATE を返し、暗黙のうちに合格することは決してありません。ここでの合格は、このエンジンのチェックのもとでの検証結果であり、信頼や認証の宣言ではありません。トラストアンカーと長期的な証跡は、検証ページ で扱うより深いレベルに属します。
public function extract(string $pdfData): arrayスローまたは失敗する条件: 入力が有効な PDF でない場合は InvalidArgumentException。不正な形式の /ByteRange または /Contents は空文字列を返し(フェイルクローズ)、決して肯定的な結果を返しません。
public function validateBasic(string $signedData, string $signature): ValidationReportスローまたは失敗する条件: 検証の失敗時にはスローしません。あらゆる欠陥は ValidationReport のインジケーション、たとえば HASH_FAILURE や SIG_CRYPTO_FAILURE にマッピングされます。
PAdES B-LT を生成する
「PAdES B-LT を生成する」という見出しのセクション次に、署名したばかりのドキュメントを B-LT へアップグレードします。長期保存プロデューサーは証明書チェーンに加えて OCSP/CRL の証跡を収集し、Document Security Store(DSS)を書き込みます。これは 署名ページ で説明した署名パスを継続するもので、出力バッファ、オブジェクトレジストリ、および署名の /Contents 16 進値を提供します。
use NextPDF\Enterprise\Security\Ltv\LtvManager;use NextPDF\Security\Signature\CertificateInfo;use NextPDF\Security\Signature\SignatureLevel;
$certInfo = CertificateInfo::fromPkcs12('/secure/signer.p12', $p12Password);
// $httpClient is any PSR-18 client; it fetches OCSP responses and CRLs.$ltv = new LtvManager($certInfo, $httpClient, level: SignatureLevel::PAdES_B_LT);
// $buffer, $registry, and $signatureContentsHex come from the signing pass.$dssObjectNumber = $ltv->enableLtv($buffer, $registry, $signatureContentsHex);戻り値は、ドキュメントカタログの /DSS エントリのための DSS オブジェクト番号です。プロデューサーはデフォルトで strict な失効強制を行います。失効情報が欠けている場合は、中身のない「B-LT」ファイルを暗黙のうちに出力するのではなく、例外を発生させます。
public function enableLtv(BinaryBuffer $buffer, ObjectRegistry $registry, string $signatureContentsHex): intスローまたは失敗する条件: チェーン検証が失敗した場合、証明書が失効している場合、または strict のデフォルトのもとで失効情報が欠けている場合に NextPDF\Enterprise\Security\Ltv\LtvException。
4. 何かが失敗したとき
「4. 何かが失敗したとき」という見出しのセクションstatus: no_license — エンベロープがロードされていない
「status: no_license — エンベロープがロードされていない」という見出しのセクションステップ 2 が status: no_license と runtime: disabled を表示し、結果に警告 No license configured. Enterprise runtime is disabled. Install a license or purchase one at https://nextpdf.dev/pricing を含みます。その後、エンタイトルメントによってゲートされた呼び出しは、コード SPEC-LIC-001 の NextPDF\Accelerator\Exception\SpectrumAuthenticationException をスローします。たとえば Capability '...' requires a valid license. です。対処法: ライセンスとアクティベーション に従ってエンベロープを配置してアクティベートし、ステップ 2 を再実行してください。
InvalidArgumentException: Input does not start with %PDF header
「InvalidArgumentException: Input does not start with %PDF header」という見出しのセクションSignatureExtractor::extract() が PDF ではないもの、すなわち誤ったパス、空の読み取り、または圧縮されたダウンロードを受け取りました。ロードしたファイルを確認してください。空の $signatures リストはこれとは異なります。ファイルは PDF ですが /Type /Sig ディクショナリを含んでいないため、検証すべきものがありません。
LtvException: Strict revocation: LTV warning: no revocation data for certificate at chain position 0
「LtvException: Strict revocation: LTV warning: no revocation data for certificate at chain position 0」という見出しのセクションenableLtv() がチェーン内の証明書について OCSP レスポンスまたは CRL を取得できず、strict のデフォルトが証跡なしで B-LT の主張を書き込むことを拒否しました。ホストからのレスポンダー到達性を確認してください。あるいは、警告のみの実行を明示的に受け入れる場合にのみ enforcementMode: RevocationEnforcementMode::PERMISSIVE を渡してください。欠落した失効の証跡を明示的に受け入れて文書化しない限り、そのような出力を本番やコンプライアンスのワークフローで B-LT として決してラベル付けしないでください。関連: TSA クライアントなしで B-LTA を要求すると LtvException: TSA client required for document timestamps で失敗します。
次のステップ
「次のステップ」という見出しのセクション- 署名: PAdES B-LT / B-LTA、DSS、ドキュメントタイムスタンプ — プロデューサーの完全な動作、順序付けのルール、およびアーカイブループ。
- 署名検証 — 時刻ベースおよび長期の検証、トラストアンカー、アーカイブチェーン。
- ライセンス — NextPDF Enterprise — エンタイトルメントの状態、猶予、機能ゲーティング。
- NextPDF Enterprise モジュール索引 — このエディションが提供するその他すべて。