我对OpenSSL验证标志PKCS7_NOCHAIN的含义感到困惑。根据定义,它说:"如果PKCS7_NOCHAIN被设置,那么消息中包含的证书就不会被用作不受信任的CA。
如果PKCS7_NOCHAIN被设置,那么消息中包含的证书就不会被用作不受信任的CA。这意味着整个验证链(除了签名者的证书)必须包含在可信存储中。
"消息中包含的证书不被用作不受信任的CA "和 "整个验证链必须包含在受信任的存储中" 。
通常情况下,验证会走过验证发行人根ca证书的链条。PKCS7_NOCHAIN标志有什么变化?
根据这里的文档,好像是指示OpenSSL信任证书颁发者,而不是验证走链的颁发者。https:/www.php.netmanualenopenssl.pkcs7.flags.php
一条消息由单个签名者的证书签名,但可能包含多个证书。典型的情况是,当签名者的证书由中间人签发,并由可信存储中的一个根证书签名时,就会发生这种情况。
典型的验证过程如下。
在邮件所附的证书中找到签名者的证书。验证它(检查目的、检查前不检查、检查后不检查等)。
在可信存储中或附件证书中找到签发人的证书。验证证书并验证签名者证书的签名。
对发行人的发行人做同样的工作,以此类推,直到达到自签证书。
终止的自签证书必须在可信存储中。
选项 PKCS7_NOCHAIN
修改步骤2和步骤3:在可信存储中搜索中间证书。只是. 附带的证书可忽略不计。
证明:功能 PKCS7_verify
在 文件pk7_smime.c,第272行。如果标志 PKCS7_NOCHAIN
未设置,则将消息中的证书添加为 chain
在呼吁 X509_STORE_CTX_init
.
可信的证书存储被设置为 商店,要验证的终端实体证书被设置为x509,并将一组附加证书(将是不可信的,但可能用于建立链)在 链条.
如果 PKCS7_NOCHAIN
设为,则 chain
的论点 X509_STORE_CTX_init
是 NULL
- 忽略附加在消息上的证书。