跳到內容
getnextpdf.com

Enterprise 版本

簽章:PAdES B-LT / B-LTA、DSS、文件時間戳記

NextPDF Enterprise 在 Core Cryptographic Message Syntax(CMS)簽章之上加入長期保存產生器:文件安全儲存區(DSS)、每個簽章的驗證相關資訊(VRI),以及文件時間戳記。這些結構會將 PDF Advanced Electronic Signatures(PAdES)基準簽章從 B-B 提升到 B-LT,再提升到 B-LTA。本頁描述行為層面。它說明產生器會寫入什麼、不會決定什麼,以及 Pro 邊界從哪裡開始。

此能力隨 NextPDF Enterprisenextpdf/enterprise)提供,並以 Enterprise 級授權封套啟用。未持有該權利的部署不會載入此能力的類別。比較各版本並取得授權

NextPDF Core 產生 B-BB-T PAdES 基準層級:Core 隨附軟體 CMS 簽署器加上 RFC 3161 時間戳記路徑,因此 B-T(加時間戳記)簽章是 Core 能力,不需要 Enterprise。NextPDF Pro 也會產生 B-BB-T:Pro 組合 Core 的 RFC 3161 堆疊,在簽章值上加入 signature-time-stamp 未簽署屬性(PadesBtTimestamper,已通過 fixture 驗證)。B-LTB-LTA 層級——即 DSS、VRI 與文件時間戳記產生器——是 Enterprise 能力,由 Core 或 Pro 產生。在僅有 Pro 的部署中,請求 B-LT 或 B-LTA 會 fail closed,並附上指名缺少之 Enterprise 元件的訊息,因為當 Enterprise 長期保存產生器不存在時,SignatureLevel::isAvailableInEnvironment() 會回傳 false。

PAdES 層級加入產生器版本
B-B帶有已簽署屬性的 CMS 簽章Core、Pro、Enterprise
B-T簽章值上的 RFC 3161 signature-time-stamp(結構性;非 eIDAS 合格)Core、Pro、Enterprise
B-LT帶有驗證資料的文件安全儲存區僅 Enterprise(nextpdf/enterprise
B-LTA用於存檔有效性的文件時間戳記僅 Enterprise(nextpdf/enterprise

這是規範的「層級→級別」對照矩陣:B-B 是每個版本都會產生的基準;B-T(加時間戳記)也由 Core 與 Pro 產生(Pro 組合 Core 的 RFC 3161 堆疊);B-LT 與 B-LTA 僅限 Enterprise。B-T 產生器屬於結構性;它不是經認證的 ETSI EN 319 142-1 一致性或 eIDAS 合格聲明。這與 Pro 安全頁面 上已發布的層級表相符。

Terminal window
composer require nextpdf/enterprise

nextpdf/enterprise 依賴 nextpdf/corenextpdf/pro。請在 Private Packagist 上使用你的 NextPDF 授權憑證解析此套件。

PAdES 基準簽章有四個層級。每一層都在前一層的基礎上加入資料。B-B 是帶有已簽署屬性的 CMS 簽章。B-T 會在簽章值上加入受信任的 RFC 3161 時間戳記。B-LT 會加入 DSS,其中承載驗證器在簽署憑證過期後所需的憑證、線上憑證狀態協定(OCSP)回應,以及憑證撤銷清單(CRL)。B-LTA 會在整個文件狀態(包含 DSS)之上加入文件時間戳記,讓驗證資料維持時間錨定。

Core 會建立 CMS SignedData,並以 DER 編碼存放在簽章字典的 Contents 項目中——ISO 32000-2 §12.8.1。長期驗證會用到兩種字典型別:文件安全儲存區,以及文件時間戳記字典——ISO 32000-2 §12.8。Enterprise 產生器會寫入存放憑證、OCSP 與 CRL 資料的 DSS——ISO 32000-2 §12.8.4.3;對於 B-LTA,則會寫入文件時間戳記字典——ISO 32000-2 §12.8.5。ETSI EN 319 142-2 描述相同的長期結構:用於長期簽章的 DSS 項目加上文件時間戳記——§5.5——並由簽章處理器支援——§6.3.3.3。

產生器會為鏈中每個憑證收集撤銷資料。它會先查詢 OCSP 回應器;OCSP 回應會回報 goodrevokedunknown——RFC 6960 §2.2——而 thisUpdatenextUpdate 欄位會界定該狀態的新鮮度——RFC 6960 §4.2。若 OCSP 無法使用,則會回退到 CRL。產生器會依照路徑驗證輸入,從簽署者朝信任錨點走訪憑證鏈——RFC 5280 §6.1。

B-LTA 文件時間戳記是與時間戳記機關(TSA)之間的一次 RFC 3161 交換。該請求會回傳 Time Stamp Information(TSTInfo)值——RFC 3161 §2.4.1——其 genTime 即為符記建立時的世界協調時間(UTC)瞬時——RFC 3161 §2.4.2。該符記會嵌入一個帶有 /SubFilter /ETSI.RFC3161/DocTimeStamp 字典,涵蓋整個檔案。

產生出的簽章是否能驗證通過,由驗證器依照它所設定的信任錨點與撤銷政策決定。產生器只嵌入資料;不主張任何受信任的結果。下文重要之處都會再次重申這條邊界。

順序至關重要:DSS 必須在 B-LTA 文件時間戳記之前寫入,因為時間戳記必須涵蓋已包含驗證資料的文件狀態。下方流程展示了該產生器序列。

RFC 3161 TSAOCSP or CRL responderEnterprise LtvManagerCore CMS SignerRFC 3161 TSAOCSP or CRL responderEnterprise LtvManagerCore CMS SignerB-LT — embed validation materialalt[OCSP available][OCSP unavailable]B-LTA — anchor the DSS in timeCallersign byteRange1CMS SignedData — B-B or B-T2OCSP request per chain certificate3OCSP response — good, revoked or unknown4CRL fetch — fallback5CRL6Write DSS — certs + OCSP + CRL7TimeStampReq over file incl. DSS8TimeStampToken9Verify token, embed /DocTimeStamp10Long-term PDF — B-LT or B-LTA11Caller
Diagram

長期有效性有一條硬性的排序規則:文件時間戳記必須涵蓋驗證資料。因此 DSS 總是先寫入,而 B-LTA 時間戳記則是取自已包含它的檔案狀態。若把順序反過來,時間戳記就無法保護驗證器在多年後所讀取的任何內容——憑證、OCSP 與 CRL 都會落在其涵蓋範圍之外。因此產生器會嵌入資料並在時間上加以錨定,但不會進一步主張任何受信任的結果;那個決定屬於驗證器與它的信任錨點。在缺少撤銷資料時 fail closed,意味著聲稱具有長期層級的文件,絕不會在沒有支撐該聲明之證據的情況下被送出。其成果是一份第三方在簽署憑證過期許久之後,無須聯絡原始回應器仍可重新查核的簽章。

設計背景:長期驗證

你透過 Core 合約使用 Enterprise 長期保存產生器。正式環境程式碼應依賴合約,而非具體的 Enterprise 實作型別。

型別種類角色穩定度
SignerInterfaceinterface(NextPDF\Contracts供呼叫端使用的 Core 簽署合約stable1.0.0
SignatureLevelenum(NextPDF\Security\SignaturePAdES 層級選擇器:B-B、B-T、B-LT、B-LTAstable1.0.0
LtvManagerInterfaceinterface(NextPDF\Contracts在執行階段解析的長期驗證產生器合約stable1.0.0
TsaClientInterfaceinterface產生器為文件時間戳記所呼叫的 RFC 3161 TSA 用戶端stable1.0.0

SignatureLevel::requiresDss() 對 B-LT 與 B-LTA 為 true;SignatureLevel::requiresDocumentTimestamp() 只有對 B-LTA 為 true。當 Enterprise 長期保存產生器未安裝時,Core 的 SignatureLevel::isAvailableInEnvironment() 對 B-LT 與 B-LTA 會回傳 false;Core 協調器接著會 fail closed。具體的 Enterprise 產生器類別屬於內部實作,不是公開 API 的一部分;請依賴 LtvManagerInterface 與該 enum。

examples/contracts/pades-blt-quickstart.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Security\Signature\SignatureLevel;
/**
* Select the PAdES level for a long-term signature.
*
* B-LT embeds a DSS. B-LTA also adds a document timestamp.
* Both require the nextpdf/enterprise long-term producer at runtime.
*
* @return SignatureLevel The requested PAdES baseline level.
*/
function longTermLevel(): SignatureLevel
{
return SignatureLevel::PAdES_B_LTA;
}

簽署設定會承載該層級。Core 協調器會在執行階段透過 LtvManagerInterface 解析長期保存產生器,因此應用程式碼不會參照 Enterprise 型別。

examples/security/pades-blta-production.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Exception\NextPdfException;
use NextPDF\Security\Signature\CertificateInfo;
use NextPDF\Security\Signature\SignatureLevel;
use NextPDF\Security\Timestamp\TsaClient;
use Psr\Http\Client\ClientInterface;
use Psr\Log\LoggerInterface;
/**
* Produce a PAdES B-LTA signature through the high-level Document seam, which
* drives the Core PadesOrchestrator and the Enterprise long-term producer in the
* load-bearing order: sign, write the DSS (LtvManager::enableLtv), then add the
* /DocTimeStamp over the state that already includes it (::addDocumentTimestamp).
*/
final readonly class LongTermSigner
{
public function __construct(
private TsaClient $tsa, // RFC 3161 TSA client (required for B-T and above).
private ClientInterface $http, // PSR-18 client that fetches OCSP/CRL for the DSS.
private LoggerInterface $logger,
) {}
/**
* Sign at B-LTA and return the long-term-signed PDF bytes; requesting B-LTA
* without the nextpdf/enterprise producer fails closed rather than downgrading.
*
* @throws NextPdfException Fail-closed: enterprise producer absent
* (SignatureLevelUnreachableException), no HTTP client
* (SignatureException), or missing material (LtvException).
*/
public function sign(CertificateInfo $certInfo): string
{
try {
$document = Document::createStandalone();
$document->addPage();
$document->setSignature($certInfo, SignatureLevel::PAdES_B_LTA, $this->tsa, $this->http);
return $document->getPdfData();
} catch (NextPdfException $e) {
$this->logger->error('long-term B-LTA signing failed', ['reason' => $e->getMessage()]);
throw $e;
}
}
}

DSS 必須在文件時間戳記之前寫入。B-LTA 時間戳記涵蓋整個檔案(包含 DSS),這正是讓驗證資料本身具備時間錨定的關鍵。

  • 缺少撤銷資料時,預設 fail closed。 當未設定任何強制模式時,產生器會將任一非根憑證缺少 OCSP 回應且缺少 CRL 的情況視為錯誤,而非警告。這可避免聲稱具有長期層級的文件,在 DSS 中沒有任何撤銷資料時仍被寫出。寬鬆工作流程必須明確選用,且僅發出警告。
  • B-LTA 需要一個 TSA。 文件時間戳記是一次 RFC 3161 來回交換。未設定 TSA 用戶端時,B-LTA 步驟會引發錯誤,而不會默默產生 B-LT。
  • 順序至關重要。 只有在 DSS 寫入後才加入文件時間戳記。在 DSS 之前取得的時間戳記並不涵蓋驗證資料。
  • 氣隙(air-gapped)執行。 在嚴格離線網路政策下,產生器不會進行任何 OCSP/CRL 擷取,也不會送出任何 TSA 請求;只會使用已嵌入 DSS 中的資料。B-LTA 需要新鮮的 TSA 符記,在嚴格離線下無法達成。
  • VRI 需明確選用。 預設不會寫入每個簽章的 VRI。某些驗證器在有 VRI 時能更好地顯示長期狀態;只有在目標驗證器需要時才啟用它。

DSS 組裝成本會隨憑證鏈長度與所擷取的撤銷回應數量而增加。每次 OCSP 或 CRL 擷取都是一次網路來回;預先收集或快取的資料可省去這些來回。一次 B-LTA 執行會為文件時間戳記額外增加一次 TSA 來回。1500 ms 的牆鐘預算涵蓋單一長期簽章,前提是 OCSP/CRL 與 TSA 連線皆已暖機;冷啟動或緩慢的回應器會主導牆鐘時間。可重現性設定檔為 structural:時間戳記會嵌入簽署與蓋章的瞬時,因此兩次執行在那些位元組上會不同,但文件結構相同。

  • 信任由驗證器決定。 產生器嵌入憑證、OCSP 與 CRL。簽章是否驗證通過,取決於驗證器、它的信任錨點,以及它的撤銷新鮮度政策。NextPDF 不隨附任何內建信任清單。
  • 撤銷新鮮度有時間界限。 OCSP thisUpdate/nextUpdate 與 CRL 的有效期窗,界定了嵌入資料能維持多久仍然有用。存檔迴圈會在時間戳記憑證過期前重新蓋章;依排程執行它是你的責任。
  • Fail-closed 預設。 嚴格撤銷強制預設可避免在沒有支撐資料時做出長期聲明。
  • 請參閱 Enterprise 威脅模型章節存檔:DSS、VRI、LTV 健康

OCSP 與 CRL 擷取會聯絡各憑證所指定的回應器;這些端點與 TSA 會看到請求中繼資料。在受資料落地限制的部署中,請預先收集撤銷資料,並在嚴格離線政策下執行,讓簽署時不聯絡任何回應器或 TSA。憑證帶有主體身分。產生器只嵌入驗證所需的憑證,不會在憑證鏈之外另加身分;它不會從你提供的憑證中移除主體欄位。

產生器診斷會回報層級、鏈中位置,以及缺少資料的情況。它們不會記錄私鑰或完整憑證內容。接上 PSR-3 日誌器時,請將簽署流程的診斷日誌維持在非正式環境適用的詳細程度,並在回應器 URL 可能揭露內部基礎設施時加以清洗。請將任何嵌入的 OCSP/CRL 位元組視為文件內容,而非日誌內容。

Federal Information Processing Standards(FIPS)140-3 加密政策設定檔是隨安全模組一併記載的 Enterprise 能力。長期保存產生器除了用於文件時間戳記的 SHA-256 摘要與 RFC 3161 交換之外,不會加入任何自有的加密原語;簽署原語來自 Core 簽署器。當 FIPS 設定檔啟用時,會產生相同的 DSS 與文件時間戳記結構;該約束適用於底層的簽署與摘要演算法,而非 DSS 配置。

資產對手風險緩解措施
DSS 撤銷資料接受過時資料驗證器信任了過期的撤銷資料OCSP/CRL 新鮮度欄位界定有效性;存檔迴圈在過期前重新蓋章
B-LTA 文件時間戳記TSA 遭入侵或 TSA 無法連線沒有可信賴的時間錨點呼叫端選定的 TSA;未設定 TSA 時 B-LTA 會 fail closed
長期聲明默默地缺少資料一份沒有撤銷資料的「長期」PDFFail-closed 強制預設引發錯誤而非警告
簽章驗證驗證器信任設定錯誤驗證器不應主張的表面有效性產生器聲明它只嵌入資料;信任決定由驗證器做出
聲明標準條款
簽章值(或時間戳記符記)會以 DER 編碼存放於 /Contents 中。ISO 32000-2§12.8.1
長期驗證使用一個 DSS 與一個文件時間戳記字典。ISO 32000-2§12.8
DSS 存放憑證、OCSP 回應與 CRL。ISO 32000-2§12.8.4.3
文件時間戳記使用一個文件時間戳記字典。ISO 32000-2§12.8.5
DSS 項目與文件時間戳記支援長期簽章。ETSI EN 319 142-2§5.5
簽章處理器支援 DSS 項目與文件時間戳記。ETSI EN 319 142-2§6.3.3.3
時間戳記符記帶有一個 UTC genTime,即為它被建立的瞬時。RFC 3161§2.4.2
OCSP 回報 good、revoked 或 unknown,並受 thisUpdate/nextUpdate 界定。RFC 6960§2.2, §4.2

所有條款皆為改寫。NextPDF 不重製規範性文字;請查閱已發布的標準以取得權威用語。NextPDF 不做任何 PAdES 認證聲明。 此處所述的結構與 ETSI EN 319 142 所定義的 B-LT 及 B-LTA 層級對齊;不主張任何一致性測試結果或第三方認證。ETSI EN 319 142-1 基準層級部分不在所引用的證據集合之內,因此本頁陳述的是所產生的結構與 Pro/Enterprise 邊界,而非經認證的一致性層級。所引用的 ETSI 證據是 EN 319 142-2;ISO 與 RFC 錨點承載長期與時間戳記聲明,與 Core 簽署參考所做的一致。

  • Core 與 Pro 都會產生 B-B 與 B-T(B-T 加入 RFC 3161 signature-time-stamp;Pro 組合 Core 的 RFC 3161 堆疊)。B-LT 與 B-LTA 是 Enterprise 邊界;在沒有 nextpdf/enterprise 時請求它們,會 fail closed 並附上具名錯誤。
  • 產生器會寫入 DSS(B-LT),以及涵蓋 DSS 的文件時間戳記(B-LTA)。它嵌入驗證資料;不主張任何受信任的驗證結果。
  • Fail-closed 撤銷強制預設會在非根憑證缺少撤銷資料時引發錯誤,除非呼叫端明確選用寬鬆工作流程。
  • B-LTA 需要已設定的 TSA;沒有 TSA 時,B-LTA 步驟會引發錯誤,不會降級為 B-LT。

本頁僅記載外部可觀察的行為,以及受支援的公開 API 介面。內部命名空間路徑、輔助類別、機制表、runbook 檔名與工單前綴皆不在範圍內。

在僅有 Core 的部署中,軟體簽署器會使用本機金鑰,或透過 Core 簽署策略合約提供的金鑰,產生 PAdES B-BB-T。Core 隨附 RFC 3161 時間戳記路徑,因此不需任何進階套件即可達成 B-T。Core 沒有 DSS、VRI 或文件時間戳記產生器;請求 B-LT 或 B-LTA 會 fail closed 並附上具名錯誤。請參閱 安全 / 簽署(Core)

在僅有 Pro 的部署中,受支援的簽署路徑是 Pro 的 B-B 基準與 Pro 的 B-T 層級(Pro 組合 Core 的 RFC 3161 堆疊,以加入 signature-time-stamp 未簽署屬性),以及它的遠端與雲端金鑰管理服務(KMS)簽署策略。Pro 不產生任何 DSS、VRI 或文件時間戳記。在僅有 Pro 的部署中,請求 B-LT 或 B-LTA 的設定會 fail closed,並附上指名缺少之 Enterprise 元件的訊息。關於 Pro 簽署介面,請參閱 Pro 安全

DSS、VRI 與文件時間戳記產生器僅以行為層級描述。內部的 DSS 組裝排序邏輯、每個簽章的 VRI 鍵控內部實作,以及存檔迴圈排程內部實作,皆超出公開介面範圍,此處不予重現。

NextPDF Enterprise 會嵌入驗證資料;它整合呼叫端提供的 OCSP/CRL 回應器與 RFC 3161 TSA。它本身不會營運、託管或保證那些回應器或 TSA 的可用性。長期有效性取決於那些回應器、TSA、存檔迴圈排程與操作者——而非單靠 NextPDF Enterprise。 操作者負責 TSA 的選擇與可連線性、撤銷回應器的存取或預先收集資料、網路政策,以及在每個時間戳記憑證過期前執行存檔迴圈。

本頁涉及加密簽署與長期驗證。與 ETSI EN 319 142 所定義的 B-LT 及 B-LTA 結構對齊,是結構性陳述,並非法律意見,也不是認證。NextPDF 不做任何 PAdES 認證聲明。 關於你的法規義務,請諮詢你的合規與法律顧問。