跳转到内容

签名:PAdES B-LT / B-LTA、DSS、文件时间戳

NextPDF Enterprise 在 Core CMS 签名之上加入长期保存生成器:一个文件安全存储区(DSS)、每个签名的验证相关信息(VRI),以及文件时间戳。这些结构会把 PAdES 基准签名从 B-B 提升到 B-LT,再提升到 B-LTA。本页聚焦行为层级,说明生成器会写入什么、不决定什么,以及 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 生成器会写入 DSS,其中存放证书、OCSP 与 CRL 数据——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 文件时间戳来自与时间戳机构(Time-Stamping Authority)的一次 RFC 3161 交换。该请求会返回一个 TSTInfo——RFC 3161 §2.4.1——其 genTime 即为令牌创建时的 UTC 时刻——RFC 3161 §2.4.2。该令牌会嵌入一个 /DocTimeStamp 字典,并通过 /SubFilter /ETSI.RFC3161 覆盖整个文件。

生成出的签名是否能验证通过,由验证器及其配置的信任锚点与吊销策略决定。生成器负责嵌入数据;它并不声明受信任的结果。下文会在关键位置再次重申这条边界。

顺序至关重要: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

Enterprise 长期保存生成器通过 Core 合约使用。生产环境代码应依赖合约,而不是具体的 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/contracts/pades-blt-production.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\LtvManagerInterface;
use NextPDF\Contracts\SignerInterface;
use NextPDF\Exception\NextPdfException;
use Psr\Log\LoggerInterface;
final readonly class LongTermSigner
{
public function __construct(
private SignerInterface $signer,
private LtvManagerInterface $ltv,
private LoggerInterface $logger,
) {}
/**
* Sign, then embed the DSS and the B-LTA document timestamp.
*
* The order matters: the DSS is written first, then the document
* timestamp is taken over the document state that already includes it.
*
* @param string $byteRange The PDF byte range to sign.
*
* @throws NextPdfException When revocation material is missing under the
* fail-closed enforcement default, or when no TSA
* is configured for B-LTA.
*/
public function sign(string $byteRange): string
{
try {
$contents = $this->signer->sign($byteRange)->toHex();
// The orchestrator drives DSS collection and the document
// timestamp through the resolved LtvManagerInterface; revocation
// freshness and TSA reachability are operational inputs.
return $contents;
} catch (NextPdfException $e) {
$this->logger->error('long-term 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 字节视为文件内容,而不是日志内容。

FIPS 140-3 加密策略配置文件是随安全模块一并记录的 Enterprise 功能。长期保存生成器除了用于文件时间戳的 SHA-256 摘要与 RFC 3161 交换之外,并未加入任何自有加密原语;签署原语由 Core 签署器提供。启用 FIPS 配置文件时,会生成相同的 DSS 与文件时间戳结构;该约束适用于底层签署与摘要算法,而非 DSS 布局。

资产对手风险缓解措施
DSS 吊销数据接受过时数据验证器信任了过期的吊销数据OCSP/CRL 新鲜度字段界定有效性;存档循环在过期前重新加盖时间戳
B-LTA 文件时间戳TSA 遭入侵或 TSA 无法连接没有可信的时间锚点调用方选定的 TSA;B-LTA 在未配置 TSA 时 fail closed
长期声明静默缺少数据一份没有吊销数据的「长期」PDFFail-closed 强制默认引发错误而非警告
签名验证验证器信任配置错误验证器不应主张的表面有效性生成器声明它仅嵌入数据;信任决定由验证器作出
声明标准条款reference_id
签名值(或时间戳令牌)会以 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 认证声明。 此处所述结构与 B-LT 及 B-LTA 层级对齐,这些层级定义于 ETSI EN 319 142;不主张任何一致性测试结果或第三方认证。ETSI EN 319 142-1 的基准层级部分不在所引用的证据集合之内,因此本页陈述的是生成出的结构与 Pro/Enterprise 边界,而非经认证的一致性层级。所引用的 ETSI 证据是 EN 319 142-2;ISO 与 RFC 锚点支撑长期与时间戳声明,与 Core 签署参考中的表述完全一致。

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-B 与 B-T 由 Core 与 Pro 生成,而 B-LT 与 B-LTA 仅由 Enterprise 生成。B-T 生成器属于结构性能力——它组合 RFC 3161 signature-time-stamp,依照所引用的 RFC 3161 / RFC 5652 / ETSI EN 319 122-1 证据;它并非经认证的 ETSI EN 319 142-1 一致性或 eIDAS 合格声明。在仅有 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 合格声明。

长期保存生成器是 Enterprise 版本的一部分(license_feature_flag: enterprise)。它在运行时通过 Core 合约解析;从 Pro 升级到 Enterprise 时,公开 API 不会变更。

  • 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。

本公开页面仅描述外部可观察的生成器行为。它不包含任何内部命名空间路径、任何内部类或 trait 名称、任何 runbook 文件名,以及任何内部工单前缀。具体的 Enterprise 长期保存生成器类型仅通过公开的 Core 合约(LtvManagerInterfaceSignatureLevel)来引用。详细的 DSS 组装与存档循环内部实现位于 NDA 约束下的门控深入参考中。

在仅有 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 的选择与可连接性、吊销响应器的访问或预先收集的数据、网络策略,以及在每个时间戳证书过期前执行存档循环。

本页标记为 export_control_class: legal-review-required。它涉及加密签署与长期验证。在配置 publish 标志之前,需取得法律批准。与 B-LT 及 B-LTA 结构对齐——这些结构定义于 ETSI EN 319 142——是一项结构性陈述,并非法律意见,也非认证。NextPDF 不做任何 PAdES 认证声明。 关于你的法规义务,请咨询你自己的合规与法律顾问。