php - 此 pdf 数字签名正确吗? PHP/TCPDF

标签 php pdf openssl digital-signature tcpdf

我正在为我的公司更新一个项目,其中有一个部分需要使用我们的证书文件对 pdf 进行数字签名。在这种情况下,我应该使用 PHP 的更新库来更改签署此 pdf 的脚本。

在旧代码中,我们使用另一个脚本来实现这一点,并且我们必须使用 .p12 文件 + 字符串。使用这个旧脚本,当您使用 Acrobat Reader DC 打开创建的 pdf 时,我们会得到下一张图像,您可以在其中看到“已签名且所有签名均有效”。

enter image description here

在新脚本中,我使用下一个示例:

https://tcpdf.org/examples/example_052/

为了能够将此示例与我的证书一起应用,我必须将我的 pfx 文件证书(“.p12”)转换为 2 种“.pem”,抛出以下命令行:

openssl pkcs12 -in myOldCertificate.p12 -clcerts -nokeys -out publicCert.pem -> 要求我“输入导入密码”

openssl pkcs12 -in myOldCertificate.p12 -nocerts -out privateKey_cert.pem -> 询问我“输入导入密码”以及“输入 PEM 密码短语”

最后,我只是更改了下载示例 52 中的第 89 行。

//设置文档签名

$pdf->setSignature('file:///var/www/html/publicCert.pem', 'file:///var/www/html/privateKey_cert.pem', 'xxxxxx', '', 2、$信息); -> 在“xxxxx”中,我编写了与导入密码相同的字符串,以防万一,PEM 密码短语也相同。

当我创建数字签名的 pdf 并使用 Acrobat Reader DC 打开它时,您可以看到下图:

enter image description here

我担心的是,因为我可以看到上面写着“由我公司认证”,看起来一切正常,但没有绿色勾号,我不确定它是否完全有效。您必须认为我需要最安全的方式来验证此 pdf 的真实性和完整性。

最佳答案

PDF 格式支持两种类型的用户签名:

  • 批准签名和
  • 认证签名。

认证签名除了签署文档外,还可以选择签名后允许对文档进行哪些更改;批准签名只是签名。

通常,文档的作者使用认证签名对其进行签名,以表明他是文档的作者,并且仅允许对其进行某些添加(例如表单填写)。然后,经过如此认证的文档将转发给其他各方(可能在填写表格后)使用批准签名签署文档,以表明他们批准文档内容(包括其添加内容)。

您的旧代码应用了批准签名,而新代码应用了认证签名,允许“仅进行表单填写、签名和页面添加操作”。

关于您的担忧

My worry is because I can see that says "Certified by My company certification" and seems all ok but there is not green tick and I'm not sure if it's completely valid.

除了上述差异外,认证签名与批准签名一样有效。作为签名状态栏图标含义的概述,请查看此处:

Acrobat signature validation cheat sheet

(此备忘单适用于Adobe Acrobat和Reader 9;同时认证丝带的颜色从蓝色变为黑色,但其含义仍然相同)

<小时/>

如果您确实想返回批准签名,请尝试延长该行

$pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);

在示例代码中带有另一个参数

$pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info, 'A');

这应该(乍一看 TCPDF 源)导致代码创建批准签名。

关于php - 此 pdf 数字签名正确吗? PHP/TCPDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209229/

相关文章:

java - PDFBox 臃肿的 PDF 文件大小

linux - 如何将查找的输出通过管道传输到 pdf 查看器

ssl - openssl参数和 key 生成的基本使用

PHP file_get_contents() 和 XML 文件

php - 如何在php中限制每个用户的并发登录数

php - 测试客户端浏览器中是否安装了客户端证书

php - 立即成功消息 - 即使用户很快关闭浏览器,php 脚本也会执行吗?

python - Nbconvert 不显示 jupyter 笔记本中的 styler 数据帧

ssl - 在 OpenSSL API 代码中查找主 key 的 MAC key 、加密 key 和初始化向量

c - 链接到不同版本的 SSL 共享库