跳转到内容
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 层级的授权信封(license envelope)激活。没有该授权的部署不会加载此能力的类。比较版本并获取授权

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,其中包含验证器在签署证书过期后仍需要的证书、Online Certificate Status Protocol(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,TSA)的一次 RFC 3161 交换。该请求会返回一个 Time Stamp Information(TSTInfo)值——RFC 3161 §2.4.1——其 genTime 即为令牌创建时的 Coordinated Universal Time(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

长期有效性有一条硬性排序规则:文档时间戳必须覆盖验证数据。因此总是先写入 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 未签署属性),以及它的远程与云端 key management service(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 认证声明。 关于你的法规义务,请咨询你的合规与法律顾问。