PAdES 基准等级映射
PAdES 是 PDF 高级电子签名的配置文件系列,由 ETSI EN 319 142 标准化。它定义了四个基准一致性等级:B-B、B-T、B-LT 与 B-LTA,每个较高等级都在下一级之上附加材料。本页将这些等级映射到 NextPDF 实际生成的内容,并区分 Core 接口与 Pro、Enterprise 版本。这份映射位于行为层面:它描述引擎输出什么,而不是内部类别。
简要结论如下。NextPDF Core 生成与 B-B 及 B-T 等级对齐的签名结构。B-LT 与 B-LTA 的生成路径随 Pro 与 Enterprise 版本一同提供。任何已生成的签名是否在某个等级被接受为符合,取决于验证方以及该验证方配置的信任锚点。生成方无法代替验证方宣告符合性。
composer require nextpdf/core:^3概念总览
标题为“概念总览”的章节PDF 数字签名是一个 CMS SignedData 结构,存储在签名字典的 Contents 项中。ByteRange 数组指出摘要所覆盖的字节区间——ISO 32000-2 §12.8.1。CMS SignerInfo 携带已签名属性,包括 content-type 与 message-digest 属性——RFC 5652 §5.3。覆盖这些属性的消息摘要由 §5.4 程序计算得出。PAdES 沿用 CAdES 的属性模型,并将其嵌入该 PDF 签名字典中。
四个基准等级是叠加式的:
- B-B 携带基础签名及其必要的已签名属性。
- B-T 添加一个针对签名值计算的签名时间戳属性。时间戳属性证明签名在被加盖时间戳的那一刻已经存在——ETSI PAdES §5.4.3。该令牌由 RFC 3161 时间戳服务机构(Time-Stamping Authority)生成——RFC 3161 §2.4.1。
- B-LT 添加长期验证材料——证书、OCSP 与 CRL 数据——并将其放入文档安全存储区(Document Security Store)中——ETSI PAdES §6.2.2、ISO 32000-2 §12.8.4.3,以及 ETSI EN 319 142-2 §6.3 所描述的验证数据放置方式。
- B-LTA 添加一个归档文档时间戳,使有效性可长期维持——ETSI PAdES §6.2.2。
这四个等级严格叠加——每个较高等级都会保留下一级携带的全部内容,并只新增一层材料。每一步可由哪个版本生成,已标在转换箭头上。
API 接口
标题为“API 接口”的章节等级选择器是 SignatureLevel 枚举,其 case 为 PAdES_B_B、PAdES_B_T、PAdES_B_LT 与 PAdES_B_LTA。它的 requiresTimestamp()、requiresDss()、requiresDocumentTimestamp() 与 isAvailableInEnvironment() 方法会报告某个等级需要什么,以及当前运行时是否能满足这些要求。在 Core 发行版中,isAvailableInEnvironment() 对 B-B 与 B-T 返回 true,对 B-LT 与 B-LTA 返回 false。它对 B-LT 与 B-LTA 返回 false,是因为长期验证的生成端只在运行时通过 resolve(解析)取得,并不属于开源软件包。生产环境代码应使用 SignerInterface 契约,而不是这些内部类型。
等级支持对照表
标题为“等级支持对照表”的章节| 等级 | 它新增什么 | 核心版 Core(nextpdf/core) | Pro / Enterprise(专业版/企业版) |
|---|---|---|---|
| B-B | 带有必要已签名属性的基础签名 | 生成对齐结构;以合成的黄金基准(golden baseline)进行测试 | 接口相同 |
| B-T | 针对签名值的签名时间戳 | 提供 RFC 3161 时间戳服务时,生成对齐结构 | 接口相同 |
| B-LT | 文档安全存储区中的验证数据 | Core 不提供此生成端;未安装 Enterprise 软件包时选择 B-LT,会以失败关闭(fail closed)方式处理 | 已提供生成端 |
| B-LTA | 归档文档时间戳 | Core 不提供此生成端;如上所述以失败关闭方式处理 | 已提供生成端 |
「生成对齐结构」是指引擎输出一份结构遵循所引条款的签名。该结构由项目的 tests/Corpus/pades/ 与 tests/Golden/baselines/ 产物验证。它并不表示某个外部验证器已按该等级认证输出。请参阅符合性一节。
代码示例——快速上手
标题为“代码示例——快速上手”的章节<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\SignerInterface;
/** * Sign a byte range with any SignerInterface implementation. * * @param SignerInterface $signer A Core or Premium signer. * @param string $byteRange The PDF byte range to sign. * * @return string Hex-encoded CMS SignedData for the PDF /Contents field. */function signByteRange(SignerInterface $signer, string $byteRange): string{ return $signer->sign($byteRange)->toHex();}此函数依赖 SignerInterface 契约,而不是具体类。Core 软件签名器(B-B 或 B-T)和 Premium HSM 签名器都能满足它。版本变更时,调用方代码无需改动。
代码示例——生产环境
标题为“代码示例——生产环境”的章节<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Security\Signature\SignatureLevel;
/** * Resolve the highest baseline level the current runtime can produce. * * B-B and B-T are produced by the Core distribution. B-LT and B-LTA * require the Enterprise long-term-validation package; without it the * level reports unavailable so callers fail closed rather than emit a * structure that does not carry the validation material the level names. * * @return SignatureLevel The highest level available in this runtime. */function highestAvailableLevel(): SignatureLevel{ foreach ([ SignatureLevel::PAdES_B_LTA, SignatureLevel::PAdES_B_LT, SignatureLevel::PAdES_B_T, SignatureLevel::PAdES_B_B, ] as $level) { if ($level->isAvailableInEnvironment()) { return $level; } }
return SignatureLevel::PAdES_B_B;}isAvailableInEnvironment() 对 B-B 与 B-T 返回 true,无需任何额外软件包。只有安装了 Enterprise 长期验证软件包时,它才会对 B-LT 与 B-LTA 返回 true。如果未主动选择降级却选取了不可用等级,会抛出一个带类型的不可达等级异常,异常消息会指出缺少的软件包名称。因此,配置错误的部署会以失败关闭方式处理,而不会静默输出比调用方要求更低的等级。
边界情况与陷阱
标题为“边界情况与陷阱”的章节- 结构上属于 B-T 的签名,与被验证为 B-T 的签名并不相同。验证由验证方执行,使用该验证方的信任锚点以及撤销信息的时效性。生成方无法代替验证方宣告结果。
- PAdES B-LT 与 B-LTA 需要 NextPDF Enterprise 软件包(
nextpdf/enterprise)。未安装时,签名器会以失败关闭方式处理,B-LT/B-LTA 将不可用。Core 接口通过公开的NextPDF\Contracts\SignerInterface提供 B-B/B-T,而长期验证则位于LtvManagerInterface之后。在 Core 发行版中选取不可用等级,默认会以失败关闭方式处理。带类型的异常会指出缺少的公开软件包,而不是内部类型。降级到较低等级必须主动选择,绝不是默认行为。 - 字节范围摘要必须排除签名值。把
Contents字节也纳入摘要时,验证永远无法通过——ISO 32000-2 §12.8.1。 - B-T 中的签名时间戳针对签名值计算,而不是针对文件字节。B-LTA 中的归档时间戳是独立的文档时间戳。两者不可互换——ETSI PAdES §5.4.3 与 §6.2.2。
- ETSI EN 319 142-1(基准等级的部分)不在本项目的证据语料库中。此处的等级结构主张以 ETSI EN 319 142-2、
pades配置文件、ISO 32000-2 §12.8,以及 RFC 5652 / RFC 3161 为依据。等级名称与叠加结构依据 v3.x 中的实现陈述。本文并不主张任何符合性测试结果或第三方背书。
等级成本会随等级提升而增加。B-B 是单次签名操作,对软件密钥而言通常只需个位数毫秒。B-T 会增加一次到时间戳服务机构的网络往返。B-LT 会针对链中每张证书增加一次撤销信息获取。B-LTA 会再增加一个文档时间戳。1500 ms 的 wall-clock 预算涵盖一次带有远程 TSA、且连接已预热的 B-T 签名。B-LT 或 B-LTA 面对缓慢的撤销端点时会超出此预算,应放在请求路径之外。可重现性配置文件为 structural,而不是 bitwise。时间戳会嵌入签名发生的时刻。因此,两次执行的时间戳字节会有所不同,而文件结构保持相同。
安全性注意事项
标题为“安全性注意事项”的章节签名所声称的等级与它被验证为的等级,是两件不同的事实。本页仅描述生成方接口。长期验证取决于验证数据是否在签名时被收集,以及验证方日后是否仍信任相同的锚点。这两者都不是生成方能够保证的。对时间戳的信任最终取决于对时间戳服务机构的信任,部署方会通过可注入的提供者来固定它。本页标记为 export_control_class: legal-review-required,因为它涉及密码学签名配置文件。所有规范性来源均已改写,未逐字重现,符合引用卫生要求。
符合性
标题为“符合性”的章节| 主张 | 标准 | 条款 | 证据 |
|---|---|---|---|
签名值以 DER 编码,作为 CMS SignedData 或 TimeStampToken,存储在签名字典的 Contents 项中。 | ISO 32000-2 | §12.8.1 | |
摘要按 ByteRange 区间计算,并排除签名值。 | ISO 32000-2 | §12.8.1 | |
| 签名时间戳属性针对签名值计算(B-T)。 | ETSI PAdES(EN 319 142) | §5.4.3 | |
| 长期验证材料携带于文档安全存储区中(B-LT)。 | ETSI PAdES(EN 319 142)/ ISO 32000-2 | §6.2.2 / §12.8.4.3 | 、 |
| 验证数据放置于 DSS 与 VRI 字典中。 | ETSI EN 319 142-2 | §6.3 | 、 |
| 归档文档时间戳可长期维持有效性(B-LTA)。 | ETSI PAdES(EN 319 142) | §6.2.2 | |
| SignerInfo 携带 content-type 与 message-digest 已签名属性。 | RFC 5652 | §5.3 | |
| 消息摘要按 DER 编码的已签名属性计算(§5.4 程序)。 | RFC 5652 | §5.4 | |
| 时间戳向 RFC 3161 TSA 发起请求,并返回一个 TSTInfo 结构。 | RFC 3161 | §2.4.1 |
所有条款均已改写。NextPDF 不重现规范性文字。权威表述请查阅已发布的标准。ETSI EN 319 142-1 不在证据语料库中。关于基准等级的结构性主张以上述来源为依据,并依据 v3.x 中的实现陈述。
商业脉络
标题为“商业脉络”的章节Core 生成 B-B 与 B-T 签名结构。B-LT 与 B-LTA 的生成路径、HSM 与 PKCS#11 密钥保管,以及 FIPS 140-3 密码学原则配置文件,随 Pro 与 Enterprise 版本一同提供。Core 在运行时解析长期验证的生成端。因此,开源引擎不带任何商业依赖,且 SignerInterface API 在升级时不会变更。