跳转到内容

使用 PAdES 基线签名签署 PDF(已移动)

本页过去收录的签署步骤现已被取代。请改用正式示例:

使用 PAdES B-B 签署 PDF,再扩展到 PAdES B-T

本页的较早版本曾说明,高层 Document::setSignature()save() 调用路径尚未接通,且会抛出 NotImplementedException。**这已不再成立。**这条高层调用路径现在会生成真正的签名。

Document::setSignature($cert, SignatureLevel::PAdES_B_B)->save()(以及等效的 output() / getPdfData())会写入一个 /Sig 字段,内含一个 /ByteRange,以及一个放在签名字典 Contents 条目中的 DER 编码 CMS SignedData 对象——这正是 ISO 32000-2 §12.8 为 ETSI.CAdES.detached SubFilter 所规定的结构。生成结果可由 CMS 验证:标准 CMS/PKCS#7 验证器可以解析并校验它。

  • B-B——即核心级别——可以直接通过这条调用路径生成。
  • B-T 只需在同一次调用中传入一个 TsaClient,即可加上一个 RFC 3161 signature-time-stamp。
  • B-LT / B-LTA 同样可以通过同一条高层调用路径完成(setSignature($cert, SignatureLevel::PAdES_B_LTA, $tsaClient)->save()),但前提是已安装 Pro Enterprise 包;若未安装,此次调用会以 fail-closed 方式拒绝执行,不会写出不完整的长期版本。对于加密过的文档,B-LT/B-LTA 同样会 fail-closed。

较低层的 NextPDF\Security\Signature\DigitalSigner 路径仍受支持,也是下方正式示例从头到尾演示的做法;高层调用路径只是同一套签署引擎之上的轻量封装。集成测试套件会覆盖两种路径,并生成真实且可解析的 CMS 对象。

U-1 注意事项(声明范围)。“可由 CMS 验证”是指生成的对象是格式正确的 CMS SignedData,并符合 RFC 5652 与 ISO 32000-2 §12.8—— 它并非对 ETSI EN 319 142-1 基线配置文件符合性的断言, 也不是对法律效力的断言。该标准中有关基线级别的内容并不在验证语料库之内;B-T 的 signature-time-stamp 要求是针对 ETSI EN 319 122-1 §5.3,搭配 RFC 3161、RFC 5652、RFC 5816 与 ISO 32000-2 §12.8 进行核查。B-LT/B-LTA 会生成长期验证的结构(一个 DSS 字典加一个 DocTimeStamp 版本);但它们并未被标榜为已通过配置文件符合性测试。符合性与法律效力的判定,应交由独立的验证程序认定。

旧页关于磁盘上实际输出文件的结构性陈述仍然正确。替代示例会连同佐证一并重述这些事实:

  • 签名值存储在签名字典的 Contents 条目中(ISO 32000-2 §12.8.1)。
  • 摘要值针对 ByteRange 计算,并排除签名值本身(ISO 32000-2 §12.8.1)。

本页并未断言任何由此生成的签名具有法律效力。这取决于证书、证书的信任锚点以及验证方策略;这些都不在本库范围内。