当前位置: 首页 > 知识库问答 >
问题:

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

桑飞语
2023-03-14

我想验证一个数字签名的PDF,并获得类似于PHP7.4中AdobeAcrobat的信息。

  1. 我通过读取PDF文件中ByteRange中定义的字节并将其存储在变量中,从而获得PDF的签名
  2. 然后我将其转换为:base64_编码(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字符串
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验证文档在签名后没有被修改,并使用这些数据/信息

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

问候和感谢!


共有1个答案

白彦
2023-03-14

签名有效性验证是一项非常艰巨的任务,涉及面很广,在stackoverflow中很难得到充分的回答。尤其是PHP对加密库的支持有限。

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

PDF签名验证包括两个主要部分。

  1. 计算已签名文档的摘要。为此,请将签名之外的所有内容都拿走。也离开

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

 类似资料:
  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 现在,使用这些标记,我在api文件中创建了一个函数,但它将<code>0 函数代码: 那么,如何使用WordPress hook<code>wp_get_current_user()获取登录用户数据呢? 其次,我如何使< code > jwt-auth/v1/token API动态获取用户名和密码? P. S我在htacceess文件中添加了ReWriteCond和ReWriteRur,并且在我的

  • 我想知道如何从pdf中提取数据,通过使用python语言在py魅力。我试图通过从pypdf2导入使用py魅力编码,但它没有显示结果。

  • 我有一个angular应用程序和一个Azure Functions应用程序。这两个应用程序都经过Azure AD的身份验证。虽然我在放入正确的凭据后调用Functions应用程序的功能,但它工作正常。Angular应用程序正在将令牌附加到调用中,用于验证Azure函数。然而,在Azure函数中,我需要根据用户设置一些逻辑,但无法找到如何获取调用该函数的用户的信息。我尝试ClaimsPrincipa

  • 我在我的nodejs应用程序中为注册用户在keybeat上实现了keybeat,我使用的登录API是: 如果用户名和密码正确,则返回登录用户的令牌, 现在我需要传递这个令牌(通过上面的API返回),并检查这个令牌是否正确,如果令牌正确,我需要用户详细信息,是否有用于此的API。 提前谢谢

  • 问题内容: 可以说我有这样的东西(客户端代码): 这段代码是完整的功能,但是我真的不知道如何根据pem文件中可用的一个具体的CA证书来验证服务器的证书。 所有证书均由我的自签名CA签名,这是我需要根据其进行验证的CA(仅针对此证书)。 每个答案表示赞赏。 编辑: 回应 jglouie (非常感谢您-无法投票支持您的答案)。 我创建了解决方案: 问题答案: 我假设您的CA的自签名证书已按以下方式加载