首页 > 解决方案 > OpenSSL PKCS7_NOCHAIN 标志的验证过程是什么

问题描述

我对 OpenSSL 验证标志 PKCS7_NOCHAIN 的含义感到困惑。根据定义,它说:

如果设置了 PKCS7_NOCHAIN,则消息中包含的证书不会用作不受信任的 CA。这意味着整个验证链(除了签名者的证书)必须包含在受信任的存储中。

“消息中包含的证书不用作不受信任的 CA”和“整个验证链必须包含在受信任的存储中”

通常,验证会遍历验证颁发者/根 ca 证书的链。PKCS7_NOCHAIN 标志有什么变化?

根据此处的文档,它似乎指示 OpenSSL 信任证书颁发者,而不是验证发行者走链。https://www.php.net/manual/en/openssl.pkcs7.flags.php

标签: opensslcertificateca

解决方案


消息由单个签名者的证书签名,但可能包含多个证书。通常,当签名者的证书由中间人颁发时会发生这种情况,中间人由受信任存储中的根证书签名。

典型的验证过程如下:

  1. 在附加到消息的证书中找到签名者的证书。验证它(检查目的,不之前检查,不之后检查等)

  2. 在受信任的存储或附加证书中查找颁发者的证书。验证证书并验证签名者证书的签名。

  3. 对颁发者的颁发者执行相同的操作,依此类推,直到获得自签名证书。

  4. 终止的自签名证书必须在受信任的存储中。

该选项修改了第 2 步和第 3 步:PKCS7_NOCHAIN在受信任的存储中搜索中间证书。附加的证书将被忽略。

证明:文件 pk7_smime.cPKCS7_verify中的函数,第 272 行 如果未设置 标志,则将消息中的证书添加为调用.PKCS7_NOCHAINchainX509_STORE_CTX_init

受信任的证书存储设置为store,要验证的最终实体证书设置为 x509 ,并且在 chain 中设置了一组附加证书(将不受信任但可能用于构建链

如果PKCS7_NOCHAIN已设置,则is的chain参数- 附加到消息的证书将被忽略。X509_STORE_CTX_initNULL


推荐阅读