openssl - OpenSSL PKCS7_NOCHAIN 标志的验证过程是什么
问题描述
我对 OpenSSL 验证标志 PKCS7_NOCHAIN 的含义感到困惑。根据定义,它说:
如果设置了 PKCS7_NOCHAIN,则消息中包含的证书不会用作不受信任的 CA。这意味着整个验证链(除了签名者的证书)必须包含在受信任的存储中。
“消息中包含的证书不用作不受信任的 CA”和“整个验证链必须包含在受信任的存储中”
通常,验证会遍历验证颁发者/根 ca 证书的链。PKCS7_NOCHAIN 标志有什么变化?
根据此处的文档,它似乎指示 OpenSSL 信任证书颁发者,而不是验证发行者走链。https://www.php.net/manual/en/openssl.pkcs7.flags.php
解决方案
消息由单个签名者的证书签名,但可能包含多个证书。通常,当签名者的证书由中间人颁发时会发生这种情况,中间人由受信任存储中的根证书签名。
典型的验证过程如下:
在附加到消息的证书中找到签名者的证书。验证它(检查目的,不之前检查,不之后检查等)
在受信任的存储或附加证书中查找颁发者的证书。验证证书并验证签名者证书的签名。
对颁发者的颁发者执行相同的操作,依此类推,直到获得自签名证书。
终止的自签名证书必须在受信任的存储中。
该选项修改了第 2 步和第 3 步:仅PKCS7_NOCHAIN
在受信任的存储中搜索中间证书。附加的证书将被忽略。
证明:文件 pk7_smime.cPKCS7_verify
中的函数,第 272 行 如果未设置
标志,则将消息中的证书添加为调用.PKCS7_NOCHAIN
chain
X509_STORE_CTX_init
受信任的证书存储设置为store,要验证的最终实体证书设置为 x509 ,并且在 chain 中设置了一组附加证书(将不受信任但可能用于构建链)。
如果PKCS7_NOCHAIN
已设置,则is的chain
参数- 附加到消息的证书将被忽略。X509_STORE_CTX_init
NULL
推荐阅读
- spring-boot - 在 Spring Security 中使用 Oauth2 手动进行身份验证不会在整个会话期间保持 SecurityContext
- sql - 在使用 Installshield 安装期间,如何连接到现有的 Oracle 数据库?
- mysql - 更改类型字段后列的数据被截断
- python-3.x - 如何使用matplotlib绘制excel大数据集而不是从第一个索引开始
- php - 如何从curl打印值中的文本
- svg - SVG:
标记 以任何 svg 元素为目标 - php - 如何从公共/图像存储符号链接获取路径?
- reactjs - React Native登录后自动更新Async storage Key的数据
- macos - 卡特琳娜的终端“资源暂时不可用”
- javascript - Nodejs Plotlyjs 单独工作,但不能一起工作