我正在尝试使用 Global Sign 数字签名服务 API 来签署 PDF 文档。我收到了他们的一些文档。但我无法理解他们要求提供“摘要”的原因。文档建议我使用 SHA256 进行摘要,对其进行十六进制编码,然后将其转换为大写字母。但是,我不确定他们想要编码什么。它只说了一个“对象”,但没有说明对象中的内容。
文档页面:
他们的签名 API 中有两个参考:
- /身份/ {id} /签名/ {摘要};签名哈希:一旦创建私钥和证书,并且它们在单个签名会话中有效,它们可用于执行多个签名操作。摘要必须是大写的十六进制编码的 SHA256 消息摘要。返回的签名也将是十六进制编码的。
- /时间戳/{摘要};请求时间戳:此 API 提供符合 RFC3161 的时间戳以包含在签名中。
我有与 GlobalSign 合作的凭证。我能够成功使用他们的“/login”api 调用。下一步是使用他们的“/timestamp/{digest}”api。摘要中有什么?
答案1
为了创建摘要,您需要对要签名的 PDF 进行哈希处理。它应该是大写的。下面是我这样做的方法。
$pdf = file_get_contents("chicken.pdf");
$digest = strtoupper(hash('sha256', $pdf));
另外,请确保您的标头正确。它应包含从 /login 调用收到的承载令牌,如下所示:
$headers = array('Authorization: Bearer '. $access_token);
如果您在标题中留下不必要的信息,您将得到 504 超时。
答案2
您需要在本地执行大部分签名过程 - 唯一的区别是您调用 API 而不是使用本地 crt/pem/key 文件(或智能卡)。
如果您尝试创建可在 Adobe Reader 等应用程序(在其“签名”面板中)中看到的签名,则需要按照以下文档进行操作:
- Adobe可移植文档格式 — 第 1 部分:PDF 1.7(从 12.8 节“数字签名”开始)
- 欧洲电信标准协会电子签名和基础设施 (ESI);CMS 高级电子签名 (CAdES)
- 欧洲电信标准协会电子签名和基础设施 (ESI);PAdES 基线概况
第一个文档(PDF 规范)告诉您摘要中包含哪些字节范围,以及如何将生成的签名嵌入回 PDF 文档中。
请注意 PDF需要时间戳与数字签名配对——你不能只是时间戳。