Skip to content

デジタル署名(HasSecurity)

HasSecurity トレイトは、PAdES準拠のデジタル署名のための setSignature() を提供します。TCPDF-Nextは、基本(B-B)からアーカイブ(B-LTA)までの4つの署名レベルを PadesOrchestratorTsaClient、およびLTVモジュールを通じてサポートしています。すべての署名メソッドはチェーン用に static を返します。

クイックリファレンス

クラス / 列挙型用途
CertificateInfo署名証明書の読み込み(PEMまたはPKCS#12)
SignatureLevel列挙型: PAdES_B_BPAdES_B_TPAdES_B_LTPAdES_B_LTA
TsaClientRFC 3161タイムスタンプ認証局クライアント
SignatureAppearance可視または不可視の署名ウィジェット
OcspClientRFC 6960オンライン失効確認
CrlFetcherRFC 5280 CRL配布ポイント取得

署名レベル

レベル含まれるもの有効性
B-B(基本)署名 + 署名証明書証明書が失効していない間有効
B-T(タイムスタンプ)B-B + RFC 3161タイムスタンプ署名がある時点以前に存在したことを証明
B-LT(長期)B-T + OCSP/CRLレスポンス付きDSS証明書の有効期限切れ後も検証可能
B-LTA(アーカイブ)B-LT + ドキュメントタイムスタンプ + アーカイブループ無期限に検証可能

証明書の読み込み

PEMファイルから

php
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;

$cert = CertificateInfo::fromFiles(
    certPath: '/path/to/certificate.pem',
    keyPath: '/path/to/private-key.pem',
    password: 'key-password',
    extraCerts: '/path/to/ca-chain.pem',  // オプションの中間証明書
);

PKCS#12(.p12 / .pfx)から

php
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;

$cert = CertificateInfo::fromPkcs12(
    p12Path: '/path/to/certificate.p12',
    password: 'pkcs12-password',
);

署名の例

php
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;
use Yeeefang\TcpdfNext\Contracts\SignatureLevel;
use Yeeefang\TcpdfNext\Security\Timestamp\TsaClient;

$cert = CertificateInfo::fromFiles(
    certPath: '/path/to/certificate.pem',
    keyPath: '/path/to/private-key.pem',
    password: 'key-password',
);

// PAdES B-B(基本) — 署名のみ
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_B)
    ->addPage()
    ->setFont('Helvetica', '', 12)
    ->cell(0, 10, 'Signed document (B-B)')
    ->save('signed-bb.pdf');

// PAdES B-T(タイムスタンプ) — 署名 + タイムスタンプ
$tsa = new TsaClient('https://freetsa.org/tsr');
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
    ->addPage()
    ->cell(0, 10, 'Signed with timestamp (B-T)')
    ->save('signed-bt.pdf');

// PAdES B-LTA(アーカイブ) — 完全な長期検証
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_LTA, $tsa)
    ->addPage()
    ->cell(0, 10, 'Archival signature (B-LTA)')
    ->save('signed-blta.pdf');

TsaClient はオプションの認証をサポートしています。リプレイ攻撃とSSRFを防ぐため、ノンス検証とDNSピニングがデフォルトで有効になっています。

php
$tsa = new TsaClient(
    url: 'https://tsa.example.com/timestamp',
    user: 'tsa-user',
    pass: 'tsa-password',
);

長期検証(B-LT / B-LTA)

B-LTおよびB-LTAレベルでは、失効データが自動的に取得され埋め込まれます:

  • OcspClient — 証明書のAIA拡張からOCSPレスポンダーに問い合わせ(RFC 6960)
  • CrlFetcher — 配布ポイントからCRLをダウンロード(RFC 5280)
  • DSS — ドキュメントセキュリティストアにOCSPレスポンスとCRLを保存
  • VRI — 署名ごとの検証データ(オプション、ETSI推奨に準拠)

B-LTAはさらにドキュメントタイムスタンプを追加し、アーカイブループを実現します。ドキュメントを再タイムスタンプすることで有効期間を無期限に延長できます。

署名の外観

デフォルトでは、署名は不可視です。可視署名ウィジェットを作成するには:

php
use Yeeefang\TcpdfNext\Security\Signature\SignatureAppearance;

$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
    ->setSignatureAppearance(
        SignatureAppearance::visible(x: 20, y: 250, w: 80, h: 30)
    )
    ->addPage()
    ->cell(0, 10, 'Document with visible signature')
    ->save('visible-signature.pdf');

明示的に不可視の署名にするには:

php
$pdf->setSignatureAppearance(SignatureAppearance::invisible());

アルゴリズムとメソッドリファレンス

phpseclib3による署名アルゴリズム:RSA PKCS#1 v1.5(デフォルト、最も広い互換性)および RSASSA-PSS(より強力なパディング、新規導入に推奨)。

php
$pdf->setSignature(
    CertificateInfo   $cert,           // 証明書と秘密鍵
    SignatureLevel    $level,           // B-B、B-T、B-LT、またはB-LTA
    ?TsaClient        $tsa   = null,   // B-T、B-LT、B-LTAで必須
);

チェーン用に static を返します。署名は save() または output() 時に適用されます。

LGPL-3.0-or-later ライセンスの下で公開されています。