签名:PAdES B-LT / B-LTA、DSS、文件时间戳
NextPDF Enterprise 在 Core CMS 签名之上加入长期保存生成器:一个文件安全存储区(DSS)、每个签名的验证相关信息(VRI),以及文件时间戳。这些结构会把 PAdES 基准签名从 B-B 提升到 B-LT,再提升到 B-LTA。本页聚焦行为层级,说明生成器会写入什么、不决定什么,以及 Pro 边界从哪里开始。
composer require nextpdf/enterprisenextpdf/enterprise 依赖 nextpdf/core 与 nextpdf/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 响应会返回 good、revoked 或 unknown——RFC 6960 §2.2——而 thisUpdate 与 nextUpdate 字段用于界定该状态的新鲜度——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 文件时间戳之前写入,因为时间戳必须覆盖已包含验证数据的文件状态。生成器流程如下所示。
API 接口
标题为“API 接口”的章节Enterprise 长期保存生成器通过 Core 合约使用。生产环境代码应依赖合约,而不是具体的 Enterprise 实现类型。
| 类型 | 种类 | 角色 | 稳定性 | 自 |
|---|---|---|---|---|
SignerInterface | interface(NextPDF\Contracts) | 调用方依赖的 Core 签署合约 | stable | 1.0.0 |
SignatureLevel | enum(NextPDF\Security\Signature) | PAdES 层级选择器:B-B、B-T、B-LT、B-LTA | stable | 1.0.0 |
LtvManagerInterface | interface(NextPDF\Contracts) | 在运行时解析的长期验证生成器合约 | stable | 1.0.0 |
TsaClientInterface | interface | 生成器为文件时间戳调用的 RFC 3161 TSA 客户端 | stable | 1.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。
代码示例——快速上手
标题为“代码示例——快速上手”的章节<?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 类型。
代码示例——生产环境
标题为“代码示例——生产环境”的章节<?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 健康。
数据驻留与 PII 缓解措施
标题为“数据驻留与 PII 缓解措施”的章节OCSP 与 CRL 获取会联系各证书中指定的响应器;这些端点与 TSA 会看到请求元数据。在受数据驻留限制的部署中,请预先收集吊销数据,并在严格离线策略下执行,以便签署时不联系任何响应器或 TSA。证书带有主体身份。生成器只嵌入验证所需的证书,不在证书链之外额外添加身份;它不会从调用方提供的证书中移除主体字段。
安全遥测与日志清洗
标题为“安全遥测与日志清洗”的章节生成器诊断会报告层级、链中位置,以及缺少数据的情况。它们不会记录私钥或完整证书内容。接入 PSR-3 日志器时,请仅在非生产环境保留签署流程的详细诊断日志,并在响应器 URL 会暴露内部基础设施时进行清洗。请将任何嵌入的 OCSP/CRL 字节视为文件内容,而不是日志内容。
FIPS 模式行为
标题为“FIPS 模式行为”的章节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 |
| 长期声明 | 静默缺少数据 | 一份没有吊销数据的「长期」PDF | Fail-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-B 与 B-T PAdES 基准层级:Core 随附软件 CMS 签署器以及 RFC 3161 时间戳路径,因此 B-T(加时间戳)签名是 Core 的能力,不需要 Enterprise。NextPDF Pro 也生成 B-B 与 B-T:Pro 组合 Core 的 RFC 3161 栈,在签名值上加入 signature-time-stamp 未签署属性(PadesBtTimestamper,已通过 fixture 验证)。B-LT 与 B-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。
NDA 扫描状态
标题为“NDA 扫描状态”的章节本公开页面仅描述外部可观察的生成器行为。它不包含任何内部命名空间路径、任何内部类或 trait 名称、任何 runbook 文件名,以及任何内部工单前缀。具体的 Enterprise 长期保存生成器类型仅通过公开的 Core 合约(LtvManagerInterface、SignatureLevel)来引用。详细的 DSS 组装与存档循环内部实现位于 NDA 约束下的门控深入参考中。
Core 回退
标题为“Core 回退”的章节在仅有 Core 的部署中,软件签署器会使用本地密钥,或通过 Core 签署策略合约提供的密钥,生成 PAdES B-B 与 B-T。Core 随附 RFC 3161 时间戳路径,因此不需要任何高级包即可达成 B-T。Core 没有 DSS、VRI 或文件时间戳生成器;请求 B-LT 或 B-LTA 会 fail closed 并附上具名错误。请参阅 安全 / 签署(Core)。
Pro 回退
标题为“Pro 回退”的章节在仅有 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 安全。
Enterprise 边界注记
标题为“Enterprise 边界注记”的章节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 认证声明。 关于你的法规义务,请咨询你自己的合规与法律顾问。
另请参阅
标题为“另请参阅”的章节- 安全 / 签署(Core) — CMS、RFC 3161、RFC 5280 路径验证、OCSP/CRL。
- Pro 安全 — B-B 基准与 Enterprise 边界。
- 存档:DSS、VRI、LTV 健康 — 长期存档与 LTV 健康。
- 签名验证 — 验证端:加密 CMS / 时间戳验证、genTime 时刻的 TSA,以及存档链验证。
- PAdES 基准对应 — 跨版本的 B-B、B-T、B-LT、B-LTA。
- PAdES · DSS · VRI · LTV — 词汇表条目。