Pro 版本
安全
NextPDF Pro 在 NextPDF Core 之上增加一个安全范围:生成期内容遮罩、文本层 PII 检测、远程与云 KMS 签名策略,以及多方顺序签名。NextPDF Core 产生 PAdES B-B 与 B-T 级别;Pro 产生相同的级别,并在其之上增加这些签名工作流程(对于 B-T,是一个 B-B 签名加上对签名值的一个 RFC 3161 signature-time-stamp)。本页是行为层面的。它陈述每一部分做什么、不做什么,以及 Enterprise 边界从何处开始。
可用性与许可
标题为“可用性与许可”的章节此能力在 NextPDF Pro(nextpdf/pro)中提供,并随一个 Pro 级别的许可信封激活。没有该权益的部署不会加载该能力的类。比较版本并获取授权。
Core 提供软件 CMS 签名器、RFC 3161 时间戳客户端、RFC 5280 路径验证,以及 OCSP 与 CRL 吊销检查。Pro 增加遮罩、PII 检测,以及远程/云 KMS/顺序签名工作流程;这些工作流程通过 Core 的 RFC 3161 栈产生相同的 Core B-B 与 B-T 级别(对于 B-T,是对签名值的一个 signature-time-stamp)。没有有效 Pro 权益的部署不会加载这些类;Core 签名契约会继续保持不变地工作。
composer require nextpdf/pro:^3概念概览
标题为“概念概览”的章节遮罩引擎在页面被写出之前,对文本应用一个有序的规则列表。每条规则匹配一个正则表达式。一条规则以三种方式之一替换一个匹配:一个从内容流中移除文本的 black-box 填充、一段相同字符数的星号,或一个固定标签,例如 [REDACTED]。如经测试,引擎会为 black-box 模式移除底层文本对象;它不会主张每种形式的敏感内容都被找到。检测取决于你所配置的规则。
PII 范围是一个检测工具,而非 redaction 保证。它提取文本层,然后对电子邮件地址、电话号码、美国社会安全号码与信用卡号应用内置模式。它返回文本的遮罩视图与匹配计数。它不会覆写页面图像中已渲染的字形。没有文本层的被扫描页面不会产生匹配。请把结果视为对所配置类型的模式匹配检测,而非完整的个人数据移除。
签名范围在 Core 签名器之上增加远程与异步工作流程。一个会话计算文档摘要、构建 CMS 签名属性,并将签名属性字节交给一个签名策略。一个策略可以是一个云 KMS、一个延迟的外部签名器,或一个包装既有 CAdES 或 XAdES 签名的接入路径。会话随后组装 CMS SignedData,并将其以 DER 编码形式存储在签名字典的 Contents 条目中 —— ISO 32000-2 §12.8.1。SignerInfo 承载 content-type 与 message-digest 签名属性;message digest 计算过程为 RFC 5652 §5.4。验证方不得依赖发起方计算的摘要;它独立地重新计算内容摘要并将其与 message-digest 属性比较,且该比较必须匹配,签名才有效 —— RFC 5652 §5.6 签名验证过程。
NextPDF Core 产生 PAdES B-B 与 B-T 级别;NextPDF Pro 产生相同的级别,并在其之上增加自己的签名工作流程。对于 B-B,会话组装一个带 B-B 签名属性集的 CMS SignedData,且不应用时间戳。对于 B-T,会话在签名值上添加恰好一个 RFC 3161 signature-time-stamp,作为一个 CMS unsigned 属性:一个 signature-time-stamp 是一个 unsigned 属性,承载对某个签名者的数字签名值计算得到的一个 time-stamp token —— ETSI EN 319 122-1 §5.3,且其 MessageImprint 是 SignerInfo signature 字段值的哈希,由 id-aa-timeStampToken OID 标识 —— RFC 3161 Appendix A。时间戳 genTime 是 token 被创建时的 UTC 时刻 —— RFC 3161 §2.4.2。由于该时间戳是一个 unsigned 属性,B-B 签名摘要、SignerInfo 签名值,以及 PDF /ByteRange 保持不变;只有 CMS 增长。RFC 3161 token 从一个所配置的时间戳提供方获取(默认的 Core RFC 3161 客户端,或调用方提供的提供方);B-T 在默认提供方路径上使用一个 SHA-256 message imprint。NextPDF Pro 依据 ETSI EN 319 122-1 §5.3、RFC 3161、RFC 5652 与 RFC 5816 实现 PAdES B-T 签名支持;这经 fixture 验证。NextPDF Pro 不主张独立的 ETSI EN 319 142-1 认证,也不主张文档的法律效力。B-LT 与 B-LTA 为长期归档验证添加一个 Document Security Store 与文档时间戳 —— ETSI EN 319 142-2 §5.5;这些级别是一项 Enterprise 能力(nextpdf/enterprise),且不由 Pro 产生。参见下文 Enterprise 边界。
为何如此设计
标题为“为何如此设计”的章节签名范围将签名属性字节交给一个 SigningStrategy,而不是持有一个私钥。这一个决定是承重的。一个云 KMS、一个延迟的外部签名器,或一个 CAdES/XAdES 接入路径全都满足同一个契约,因此调用代码保持相同,且密钥材料从不进入 NextPDF。将会话拆分为 RemoteSigningSession::prepare() 与 RemoteSigningSession::complete(),让签名可以异步返回,因为摘要在密钥被触及之前就已固定。时间戳作为一个 CMS unsigned 属性附加,因此 B-T 保持是叠加式的:B-B 签名摘要、SignerInfo 签名值,以及 /ByteRange 都未被触碰。每一个接缝都是失败关闭(fail-closed)的,因为一个静默降级的签名路径比一个停止的更糟。设计背景:大规模签名,绝不妥协。
API 范围
标题为“API 范围”的章节| Type | Kind | Role | Stability | Since |
|---|---|---|---|---|
RemoteSigningSession | class | 两阶段远程或异步签名会话 | stable | 1.9.0 |
RemoteSigningConfig | class | 不可变的会话配置,包含 PAdES 级别 | stable | 1.9.0 |
SequentialSigner | class | 带 DocMDP 支持的多方顺序签名 | stable | 1.9.0 |
SigningStrategy | interface | 会话所调用的签名机制契约 | stable | 1.9.0 |
PadesWrapper | class | 包装一个既有 CAdES 或 XAdES 签名以用于 PAdES 嵌入 | stable | 1.9.0 |
KmsSignerInterface | interface (SPI) | 第三方 HSM 与 KMS 驱动契约 | stable | 2.1.0 |
GenerationTimeMasker | class | 在页面被写出之前应用的规则驱动遮罩 | stable | 1.9.0 |
MaskingConfig / MaskingRule / MaskingMode | types | 遮罩配置、规则与替换模式 | stable | 1.9.0 |
RemoteSigningConfig 携带一个 PAdES 级别字段,其枚举是 Core 的 SignatureLevel。Pro 签名路径产生 B-B 基线与 B-T 级别:配置 RemoteSigningConfig::default()->withLevel(SignatureLevel::PAdES_B_T)(或使用 SequentialSigner::withTimestamping())并提供一个时间戳提供方,会话便会添加 RFC 3161 signature-time-stamp unsigned 属性。B-T 预留的 /Contents 空间会被自动提高以容纳该 token;一个尺寸不足的已配置空间会以一个有类型的配置错误失败关闭(fail closed),而非截断。配置中携带的一个高于 B-T 的级别(B-LT 或 B-LTA)是一个 Pro 不据此行动的前向声明(forward-declared)值;该长期生产者在运行时通过 Core 契约解析,并随 nextpdf/enterprise 包交付。
代码示例 —— 快速上手
标题为“代码示例 —— 快速上手”的章节<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Pro\Security\Signing\RemoteSigningSession;use NextPDF\Pro\Security\Signing\SigningStrategy;
/** * Produce a signed PDF using any signing strategy. * * @param string $pdfWithPlaceholder PDF bytes with a signature placeholder. * @param SigningStrategy $strategy A cloud-KMS, deferred, or ingest strategy. * * @return string The signed PDF bytes. */function signWithStrategy(string $pdfWithPlaceholder, SigningStrategy $strategy): string{ $session = RemoteSigningSession::create($pdfWithPlaceholder);
$session->prepare( certDer: $strategy->getCertificateDer(), chainDer: $strategy->getCertificateChainDer(), algorithmOid: $strategy->getSignatureAlgorithmOid(), digestAlgorithm: $strategy->getDigestAlgorithm(), contentsHexStart: 0, contentsHexEnd: 0, );
return $session->complete($strategy);}调用方依赖 SigningStrategy 契约。一个云 KMS 策略与一个 CAdES 接入策略都满足它,因此这段代码在不同策略之间不变。
代码示例 —— 生产环境
标题为“代码示例 —— 生产环境”的章节<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Pro\Security\Signing\SequentialSigner;use NextPDF\Pro\Security\Signing\SigningStrategy;use Psr\Log\LoggerInterface;
final readonly class ApprovalWorkflow{ public function __construct(private LoggerInterface $logger) {}
/** * Sign a PDF with two parties in sequence. * * @param string $pdfData The PDF bytes to sign. * @param SigningStrategy $approver The first-party strategy. * @param SigningStrategy $reviewer The second-party strategy. * * @return string The signed PDF bytes. */ public function run(string $pdfData, SigningStrategy $approver, SigningStrategy $reviewer): string { try { $result = SequentialSigner::create($pdfData) ->addSigner($approver, 'Approver', reason: 'Approved') ->addSigner($reviewer, 'Reviewer', reason: 'Reviewed') ->sign();
$this->logger->info('Sequential signing complete', [ 'signatures' => $result->signatureCount, ]);
return $result->pdfData; } catch (\Throwable $e) { $this->logger->error('Sequential signing failed', ['error' => $e->getMessage()]);
throw $e; } }}每个签名者是一个单独的增量修订。catch 块记录日志并重新抛出;它不吞没失败,这使签名路径保持失败关闭(fail-closed)。
边界情况与注意事项
标题为“边界情况与注意事项”的章节- 已产出的签名不是已验证的签名。路径验证在验证方处运行,使用该验证方的信任锚 —— RFC 5280 §6.1。生产方无法主张该结果。
- 遮罩检测取决于所配置的规则。一组不匹配某个值的规则集不会遮罩它。引擎不会主张所有敏感内容都被找到。
- PII 检测仅针对文本层。没有文本层的被扫描页面不会产生匹配。该工具不会覆写已渲染的页面字形。
- CMS 结构必须适配预留的
Contents空间。带完整证书链的 B-B SignedData 有一个大小;请据此设定预留空间的大小,否则会话会引发一个溢出错误。 - 一个云 KMS 策略取决于网络可达性与提供方可用性。一个网络或提供方错误会引发一个有类型的异常;会话不会静默地产出一份未签名的文档。
- OCSP
unknown不等于good。请把unknown视为一个无法判定(non-determination)—— RFC 6960 §2.2。
一个软件签名是个位数毫秒级。一个云 KMS 签名会向提供方增加一次网络往返。一个 B-T 签名会在签名操作之上向所配置的时间戳提供方增加一次往返。1500 ms 的 wall 预算覆盖在热连接上使用远程提供方的单个 B-B 签名。遮罩代价随规则数与文本长度而扩展。可复现性预设为 structural:B-B 签名属性嵌入签名时刻,而一个 B-T 签名额外嵌入一个时间戳 token,因此两次运行在 signing-time 与时间戳字节上不同,而已签名结构相同。
安全说明
标题为“安全说明”的章节这是一个密码学边界,因此威胁模型是显式的。字节范围由引擎计算,且绝不从调用方接受。签名路径是失败关闭(fail-closed)的:一个原语失败或一个能力缺口会引发一个有类型的异常,且绝不静默降级为更弱的算法。一个云 KMS 策略是一个集成点,而非一个密钥库。密钥保护取决于密钥处理、所配置的 KMS,以及部署;对于一个 KMS 策略,NextPDF Pro 不持有私钥。当配置为针对一个经 FIPS 验证的 KMS 或 HSM 时,Pro 以 FIPS 兼容模式运行;NextPDF Pro 本身不是一个经 FIPS 验证的密码学模块。本页涉及密码学签名;每一个规范性来源都被转述,且无一被复制。
数据驻留与 PII 缓解
标题为“数据驻留与 PII 缓解”的章节遮罩与 PII 范围在进程内运行。文档内容不会为了遮罩或 PII 检测而离开主机。一个云 KMS 策略将签名属性摘要(而非文档)发送给提供方以执行签名操作。PII 检测对所配置的类型进行模式匹配,并如经测试地为 black-box 模式移除底层文本对象;它不是完整的个人数据移除保证,也不是合规声明。
安全遥测与日志清洗
标题为“安全遥测与日志清洗”的章节库引发带结构性消息的有类型异常。它不会把文档内容或检测到的 PII 值写入异常消息或日志。一个在签名路径周围记录日志的部署应记录生产示例中所示的结构性字段,而非文档字节。
FIPS-mode 行为
标题为“FIPS-mode 行为”的章节Pro 从所配置的签名算法与策略中选择算法。当配置为针对一个经 FIPS 验证的 KMS 或 HSM 时,密码学操作在该已验证边界内运行。NextPDF Pro 本身执行结构性组装与摘要计算;它不是一个经 FIPS 验证的模块,也不作出任何 FIPS 认证声明。
Enterprise 边界
标题为“Enterprise 边界”的章节NextPDF Pro 产生 B-B 基线与 B-T 级别。B-T 在签名值上添加一个 RFC 3161 signature-time-stamp,作为一个对某个签名者的数字签名值计算得到的 CMS unsigned 属性 —— ETSI EN 319 122-1 §5.3。NextPDF Pro 依据 ETSI EN 319 122-1 §5.3、RFC 3161、RFC 5652 与 RFC 5816 实现这一点;它经 fixture 验证。NextPDF Pro 不主张独立的 ETSI EN 319 142-1 认证,也不主张文档的法律效力。
B-LT 与 B-LTA 级别是 Enterprise 能力,且不由 Pro 产生。B-LT 与 B-LTA 为长期归档验证添加一个 Document Security Store 与文档时间戳 —— ETSI EN 319 142-2 §5.5。一个请求 Document Security Store 或长期归档循环的配置会在运行时通过 Core 契约解析该生产者;该生产者随 nextpdf/enterprise 包交付。在仅有 Pro 的部署中,请求 B-LT 或 B-LTA 会失败关闭(fail closed),并给出指明缺失 Enterprise 组件的消息。Pro 不产生 Document Security Store、不产生 VRI 字典、不产生文档时间戳,也不产生归档循环,且不作出任何长期验证(LTV)声明。经由 PKCS#11 的硬件密钥保管,以及 FIPS 140-3 密码学策略预设,同样是 Enterprise 能力。
| PAdES level | Adds | Producer edition |
|---|---|---|
| B-B | 带签名属性的 CMS 签名 | Core, Pro, Enterprise |
| B-T | 对签名值的一个 RFC 3161 signature-time-stamp unsigned 属性 | Core, Pro, Enterprise |
| B-LT | 带验证材料的 Document Security Store | Enterprise (nextpdf/enterprise) |
| B-LTA | 用于归档有效性的文档时间戳 | Enterprise (nextpdf/enterprise) |
行为契约
标题为“行为契约”的章节- 遮罩在页面被写出之前应用所配置的规则,并如经测试地为 black-box 模式移除底层文本对象。
- PII 检测提取文本层、应用所配置的模式,并返回一个遮罩视图与一个匹配计数。它不会覆写已渲染的字形。
- 远程签名是两阶段的:prepare 计算摘要并构建签名属性;complete 组装 CMS 并将其嵌入。
- Pro 产生 B-B 基线与 B-T 级别。对于 B-T,会话在签名值上添加一个 RFC 3161 signature-time-stamp,作为一个 CMS unsigned 属性;B-B 签名摘要与
/ByteRange保持不变。一个没有时间戳提供方的 B-T 请求,或一个Contents空间尺寸不足的已配置请求,会以一个有类型的配置错误失败关闭。一个没有 Enterprise 包的 B-LT 或 B-LTA 请求会以一个具名错误失败关闭。 - 一个云 KMS 策略接收签名属性摘要(而非文档),并返回原始签名字节。
一致性
标题为“一致性”的章节| Claim | Standard | Clause |
|---|---|---|
CMS 签名以 DER 编码形式存储在签名字典的 Contents 条目中。 | ISO 32000-2 | §12.8.1 |
| message digest 计算过程;签名属性承载 content-type 与 message-digest。 | RFC 5652 | §5.4 |
| 验证方不得依赖发起方计算的摘要;它独立地重新计算并比较(签名验证过程)。 | RFC 5652 | §5.6 |
| 一个 PAdES B-T signature-time-stamp 是一个 unsigned 属性,承载对某个签名者的数字签名值计算得到的一个 time-stamp token(Pro 产生 B-T)。 | ETSI EN 319 122-1 | §5.3 |
signature-time-stamp id-aa-timeStampToken token 的 MessageImprint 是 SignerInfo signature 字段值的哈希。 | RFC 3161 | Appendix A |
在验证侧,NextPDF 将一个 signature-time-stamp 的 MessageImprint 绑定到 SignerInfo signature 值,并在出现不匹配、token 缺失/重复或 SHA-1 imprint 时失败关闭(fail closed)(严格验证,而非一项认证)。 | RFC 3161 | Appendix A |
| 一个 B-T 时间戳 token 携带一个 UTC genTime,即 token 被创建时的时刻。 | RFC 3161 | §2.4.2 |
| 认证路径验证检查 basic constraints 与到信任锚的路径输入。 | RFC 5280 | §6.1 |
| OCSP 将 certStatus 报告为 good、revoked 或 unknown。 | RFC 6960 | §2.2 |
| B-LT 与 B-LTA 为长期验证添加一个 Document Security Store 与文档时间戳(Enterprise 边界)。 | ETSI EN 319 142-2 | §5.5 |
所有条款均为转述。NextPDF 不复制规范性文本。请查阅已发布的标准以获取权威措辞。NextPDF Pro 依据 ETSI EN 319 122-1 §5.3(signature-time-stamp)、RFC 3161、RFC 5652 与 RFC 5816 实现 PAdES B-T 签名支持,且经 fixture 验证。ETSI EN 319 142-1(PAdES 基线级别部分)不在所引证据集之内;因此 NextPDF Pro 不主张独立的 ETSI EN 319 142-1 认证、符合性或合规,也不主张文档的法律效力。本页陈述所产生的结构、B-T 支持所实现的标准,以及 Enterprise B-LT/B-LTA 边界,而非一个经认证的一致性级别。
发布边界
标题为“发布边界”的章节本页仅记录可外部观察的行为与受支持的公开 API 范围。内部命名空间路径、辅助类、机制表、运行手册文件名,以及工单前缀不在范围内。
另请参阅
标题为“另请参阅”的章节- 安全 —— 深度参考 —— 此 Pro 安全范围的深度参考。
- Core 签名 —— CMS 签名器、RFC 3161 时间戳、RFC 5280 路径验证、OCSP 与 CRL。
- PAdES 基线映射 —— 跨版本的 B-B、B-T、B-LT、B-LTA。
- NextPDF Pro —— 完整的 Pro 功能范围。
- Core 安全 —— 加密与更广泛的签名范围。
- CMS · PAdES · RFC 3161 timestamp · KMS · DSS —— 术语表词条。