【发布时间】:2014-06-11 19:38:37
【问题描述】:
有一个自签名的根 CA 证书 rootcert.pem,具有以下 V3 扩展:
X509v3 extensions:
X509v3 Key Usage:
Certificate Sign
X509v3 Basic Constraints:
CA:TRUE
rootcert.pem 的 CA 标志设置为 true,并且其密钥使用允许证书签名。 rootcert.pem 使用以下 V3 扩展对证书 foocert.pem 进行签名:
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
foocert.pem 的 CA 标志设置为 false,并且其密钥使用不允许证书签名。但是可以说,foocert.pem 签署了 rougecert.pem。
形成foocert & roguecert的证书链:
cat foocert.pem roguecert.pem > roguechain.pem
使用 openssl verify 进行验证。验证成功:
$ openssl verify -CAfile rootcert.pem roguechain.pem
roguechain.pem: OK
使用 x509_strict 验证,仍然成功:
$ openssl verify -x509_strict -CAfile rootcert.pem badchain.pem
badchain.pem: OK
假设系统只信任根 CA 证书。对等方提供其证书链,其中一个中间证书不应该是 CA(CA 设置为 false 并且密钥使用不允许证书签名),openssl 仍然标记该链是好的吗?
如何让 openssl 不信任这样的链?
【问题讨论】:
-
badchain.pem来自哪里?是不是又应该是rougechain.pem? -
这可能是 openssl 中的一个错误,已在 1.1.0 版中修复:github.com/openssl/openssl/issues/5236 虽然在那个 GitHub 问题中看起来他们正在使用
openssl s_client,但在@paulus 下面说他正在使用openssl s_client并且 没有 看到问题。所以我不知道发生了什么。
标签: openssl certificate verification