Skip to content

数字签名

在本节中,您将了解签名和验证签名的常规步骤、相关的签名 API、数字签名交互的方式、以及我们提供的测试签名服务路由。

在 PDF 上签名和验证数字签名的步骤

签名文档

  1. 生成包含签名覆盖范围信息(签名域字典的 byteRange)的文档文件流。
  2. 对签名覆盖范围的文件流计算相应的摘要。可通过 PDFUI.registerSignHandler(signerInfo)PDFDoc.sign(signInfo,digestSignHandler) 接口实现。
  3. 使用证书对摘要进行签名来获取 signedData
  4. signedData 写入文件流。signedData 的位置在 byteRange 中指定。

验证签名

  1. 获取文档原始(未修改)文件流、签名覆盖范围信息(签名域字典的 byteRange)、签名数据和签名者。
  2. 对签名覆盖范围的文件流计算相应的摘要。可通过 PDFUI.setVerifyHandler(verifyFunction)PDFDoc.verifySignature(signatureField, verifyHandler) 接口实现。
  3. 验证摘要和签名数据,并输出验证结果,包括:
    • 文档是否被修改
    • 签名者信息是否有效
    • 时间戳是否过期等信息

数字签名相关 API

PDFUI.registerSignHandler(signerInfo)

当前,Foxit PDF SDK for Web 支持两种类型的 signature filter:

  • adbe.pkcs7.detached(支持的摘要算法:sha1sha256sha384
  • adbe.pkcs7.sha1(支持的摘要算法:sha1

PDFUI.setVerifyHandler(verifyFunction)

用于设置 Verification handler,在验证签名时将调用该 handler。返回 Signature_State 的验证结果状态。

PDFDoc.sign(signInfo,digestSignHandler)

用于对文档进行签名。需要消息摘要和签名函数。

PDFDoc.verifySignature(signatureField, verifyHandler)

用于验证签名。需要回调函数。

PDFSignature 类的主要方法

  • PDFSignature.isSigned() - 检查当前签名是否已签名
  • PDFSignature.getByteRange() - 获取当前签名的文件流中指定范围的字节范围
  • PDFSignature.getFilter() - 获取当前签名 filter
  • PDFSignature.getSubfilter() - 获取当前签名的 subfilter

数字签名功能交互

您可以通过 API 或 UI 的方式体验签名工作流。该工作流基于 Node.js 后端,可访问发布包中的 ./server/signature-server-for-win

方法1:以编程方式在当前文档上放置签名

  1. 开启服务器,运行 https://webviewer-demo.foxitsoftware.com/
  2. 在控制台中运行代码创建签名域并放置数字签名
  3. 签名后的文档将下载并在 viewer 中重新打开,可点击签名域进行验证

方法2:以 UI 的方式来放置签名

通过在线 viewer https://webviewer-demo.foxitsoftware.com/ 体验:

  1. 点击 Form 选项卡中的 signature 按钮
  2. 在页面上绘制矩形域
  3. 点击手型工具或按 Esc
  4. 在弹出框中设置签名信息并确认

验证签名:使用手型工具点击已签名的签名域进行验证

签名 HTTP 服务

测试用 HTTP 服务路由:

  • http://webviewer-demo.foxitsoftware.com/signature/digest_and_sign
  • http://webviewer-demo.foxitsoftware.com/signature/verify