PAdES B-LTA 長效驗證(LTV)¶
PAdES B-LTA(PDF Advanced Electronic Signatures — Baseline Long-Term Archive)是 ETSI EN 319 142-1 定義的最高等級簽章格式,確保數位簽章在簽署憑證到期後數十年仍可完整驗證。
LTV 透過在文件內嵌入驗證所需的所有資料(OCSP 回應、CRL、憑證鏈),消除對外部 CA 服務的長期依賴。
PAdES Profile 層次¶
B-B ──────── 基礎簽章(含簽署憑證)
└── B-T ── + 可信時戳(RFC 3161)
└── B-LT ── + OCSP / CRL / 憑證鏈嵌入(DSS 字典)
└── B-LTA ── + 存檔時戳(保護 DSS 字典不可竄改)
NextPDF Pro 提供 B-B。NextPDF Enterprise 在此基礎上新增 B-LT 與 B-LTA 能力。
核心 API¶
LtvSignature¶
use NextPDF\Enterprise\Signatures\LtvSignature;
use NextPDF\Enterprise\Signatures\LtvConfig;
use NextPDF\Enterprise\Signatures\OcspProvider;
use NextPDF\Enterprise\Signatures\CrlProvider;
use NextPDF\Enterprise\Signatures\TsaProvider;
$config = LtvConfig::create()
->withOcspProvider(
OcspProvider::http(
url: 'http://ocsp.acmeca.com',
timeout: 10,
cacheSeconds: 3600,
)
)
->withCrlProvider(
CrlProvider::http(
distributionPoints: 'auto', // 從憑證 CDP 擴充欄位自動取得
refreshIntervalHours: 24,
)
)
->withTsaProvider(
TsaProvider::rfc3161(
url: 'https://tsa.acmeca.com',
hashAlgorithm: 'SHA-384',
requireSignedResponse: true,
)
)
->embedCertificateChain(true) // 嵌入完整憑證鏈
->targetProfile(PadesProfile::BLta); // B-LTA
$ltv = new LtvSignature($config);
$signedDocument = $ltv->sign(
document: $document,
signerCredential: $pkcs12Credential,
signatureAppearance: SignatureAppearance::visible(
page: 1,
x: 400.0,
y: 50.0,
width: 180.0,
height: 60.0,
),
reason: 'Contract Approval — FY2025',
location: 'Taipei, Taiwan',
contactInfo: '[email protected]',
);
PHP Compatibility
This example uses PHP 8.5 syntax. If your environment runs PHP 8.1 or 7.4, use NextPDF Backport for a backward-compatible build.
DssBuilder¶
DSS(Document Security Store)字典是 PAdES B-LT/B-LTA 的核心資料結構,儲存所有驗證材料:
use NextPDF\Enterprise\Signatures\DssBuilder;
use NextPDF\Enterprise\Signatures\VriEntry;
$dssBuilder = DssBuilder::create()
->addCertificate($signerCert)
->addCertificate($intermediateCert)
->addCertificate($rootCert)
->addOcspResponse($signerOcspResponse)
->addOcspResponse($intermediateOcspResponse)
->addCrl($crlData)
->addVriEntry(
VriEntry::create(
signatureHash: $signatureHash,
certificates: [$signerCert, $intermediateCert],
ocspResponses: [$signerOcspResponse],
crls: [$crlData],
timestamp: $tst,
)
);
// DSS 更新後自動觸發存檔時戳(B-LTA)
$updatedDocument = $ltv->addDssAndArchiveTimestamp(
document: $bLtDocument,
dssBuilder: $dssBuilder,
);
LTV 驗證¶
use NextPDF\Enterprise\Signatures\LtvValidator;
$validator = new LtvValidator(
trustedRoots: $caBundle,
allowOfflineValidation: true, // 使用 DSS 中嵌入的資料,不需網路
);
$result = $validator->validate($signedPdfBytes);
foreach ($result->signatures() as $sig) {
echo $sig->signerDN();
echo $sig->signingTime()->format('c');
echo $sig->profile()->name; // B_B | B_T | B_LT | B_LTA
echo $sig->validationStatus()->name; // VALID | INDETERMINATE | INVALID
// 長效驗證材料
echo $sig->ltvData()->ocspResponseCount();
echo $sig->ltvData()->crlCount();
echo $sig->ltvData()->archiveTimestampCount();
echo $sig->ltvData()->estimatedValidUntil()->format('Y'); // 預估有效年限
}
存檔時戳(Archive Timestamp)¶
存檔時戳是 B-LTA 的關鍵,蓋過整個文件(包含 DSS 字典),確保驗證材料本身不可被竄改:
sequenceDiagram
participant Doc as 文件
participant TSA as 時戳局(TSA)
participant DSS as DSS 字典
Doc->>TSA: 簽章 hash(B-B)
TSA-->>Doc: 時戳 Token(B-T)
Doc->>Doc: 嵌入 OCSP + CRL + 憑證鏈(B-LT)
Doc->>TSA: 文件 hash(含 DSS)
TSA-->>Doc: 存檔時戳 Token(B-LTA)
Note over Doc,DSS: 任何後續修改均使存檔時戳失效 憑證鏈嵌入¶
use NextPDF\Enterprise\Signatures\CertificateChainEmbedder;
$embedder = new CertificateChainEmbedder(
trustedRoots: $caBundle,
includeRoot: false, // 根 CA 通常不嵌入(驗證方應自行持有)
resolveAia: true, // 自動從 AIA 擴充欄位下載中間 CA
);
$chain = $embedder->buildChain($signerCertificate);
效能規格¶
| 操作 | 指標 |
|---|---|
| B-LT 簽章(含 OCSP + CRL 嵌入) | |
| B-LTA 存檔時戳新增 | |
| LTV 離線驗證(完整鏈) |