我创建了CA如下:
- 带有私钥的自签名证书 root-ca.cer
- 其他证书,用root-ca.cer签名,其名称为admin-ca.cer
- 使用admin-ca.cer签名的客户端证书,其名称为client.cer
openssl verify
admin-ca.cer 与 root-ca.cer 的对接通过,但 client.cer 与 admin-ca.cer 的对接在第 1 级失败。
我想如果我将 root-ca.cer 添加到我的操作系统中的受信任证书中,这将解决问题,但如果可能的话,我想避免这种情况。相反,我是否可以client.cer
以这种方式构建一个,使其包含所有链,直到root-ca.cer
?
如果这很重要,那么的目的client.cer
是在通过 SSL 连接到我的服务器时用作客户端证书。一个虚拟主机用作root-ca.cer
CA,另一个用作admin-ca.cer
CA - 而那个不起作用。
不可以。您可以包含 root-ca.cer,但当它由对等方提供时,它不具有信任。将根 CA 添加到受信任证书的操作才是使其受信任的原因(“信任锚”)。
通常,证书 PEM 文件应包含所有以叶(用户或服务器)开头的证书,然后是其颁发者,再是颁发者,等等,理论上以根结尾。但实际上,如果根不为人所知且不可信,则在大多数情况下包含根不会产生任何效果,因此文件应该只包含“客户端 + admin-ca”。
至于您的 vhost 配置,将中间体直接视为信任锚:现代 OpenSSL 支持该功能(使用
PARTIAL_CHAIN
标志),我不太记得旧版 OpenSSL 1.x 是否支持,但我记得“最近”OpenSSL 根本没有很好地支持它 - 直到 LetsEncrypt 交叉签名根到期,他们才最终实现这一点。相关讨论。(LE 与服务器证书的情况类似,服务器通常配置为发送“服务器 + LE + ISRG(DST 交叉签名)”链,而旧版 OpenSSL 无法相信“ISRG”作为根 CA。)
Apache 在验证客户端证书时似乎没有设置
X509_V_FLAG_PARTIAL_CHAIN
标志,这意味着它不支持 OpenSSL 使用中间体作为受信任的 CA,因此您可能需要为所有虚拟主机配置相同的根 CA,并使用不同的方法进行管理员授权。验证客户端证书时您需要提供完整的信任链。
因此,您需要向 Web 服务器提供一个包含中间证书和根证书的文件(文件中中间证书在前面)