如何验证PDF并使用提取的X.509数据获取信息



我想验证一个数字签名的PDF,并在PHP 7.4中获得类似Adobe Acrobat的信息。

我已经取得的成就:

  1. 我通过读取中定义的字节来获得PDF的签名ByteRange,并将其存储在一个变量中
  2. 然后我这样转换它:base64_encode(hex2bin($raw_signature_data));
  3. 之后,我将格式更改为pkcs7:
$zertifikat_formattiert = "";
$zertifikat_formattiert .= "-----BEGIN PKCS7-----n";
$zertifikat_formattiert .= chunk_split($raw_signature_data, 64);
$zertifikat_formattiert .= "-----END PKCS7-----";```
  1. 然后我用openssl_pkcs7_read($zertifikat_formattiert, $zertifikate);读取格式化的pkcs7字符串
  2. 现在,我用foreach通过openssl_pkcs7_read循环输出的数组,对于每个元素,我都用以下方法获得指纹:
foreach($zertifikate as $zertifikat_nummer => $zertifikat_x509_raw) {
openssl_x509_fingerprint($zertifikat_x509_raw, "sha1WithRSAEncryption");
}


此外,我还得到了有效的从-到时间的信息,如下所示(在foreach循环中(:

$x509_zertifikat = openssl_x509_parse(openssl_x509_read($zertifikat_x509_raw));
$valid_from_time = $x509_zertifikat['validFrom_time_t'];
$valid_to_time ['validTo_time_t'];

我的问题

  1. 现在我如何验证,文档没有被修改,因为它是用PHP签署的,有这些数据/信息吗
  2. 如何检查PDF是否使用签名者计算机上的时钟进行了签名

我已经尝试过了,就像这里建议的答案一样(用PHP验证签名的PDF文档(,但没有成功。

问候和感谢!

签名有效性验证是一项艰巨的任务,涉及多个方面,在stackoverflow中很难得到完全回答。特别是在PHP对加密库的支持有限的情况下。

你需要考虑你信任哪些证书,确保这些证书没有被吊销和过期。

PDF签名验证由两个主要部分组成。

  1. 计算签名文档的摘要。为此,请获取签名ByteRange之外的所有内容。同时离开<gt;出来计算此文档的摘要。如果有多个签名,则需要解析PDF并省略所有增量保存,以获得与签名时文件相同的修订版
  2. 验证签名并比较哈希值。一种方法是执行这样的openssl命令。如何使用openssl验证文件和p7s分离的签名

最简单的是使用一些能够解析和告知文档状态的服务,比如https://documenter.getpostman.com/view/3869493/Szf6WoG1#01414413-b076-4297-a6ac-269d884a044c。否则,您可以尝试可以从PHP代码中执行的openssl命令,以下是一些想法如何使用openssl验证文件和p7s分离的签名?

最新更新