我们正在用 SHA1 哈希替换证书,因为谷歌采取了让它们在 Chrome 中显得不那么安全的举措。替换证书使用与我们当前使用的不同的中间 CA,但使用相同的根 CA。在测试期间,我们注意到我们的 SSL 客户端无法使用我们不太明白的新证书验证链。
以下是具体情况:
目前,服务器发送的链如下所示:
- 根 CA,由同一机构的服务器 CA X 签名(附带服务器证书)
- 中间 CA 1(附带服务器证书)
- 服务器证书
在我们信任的 SSL 客户端中:
- 根 CA,自签名,但相同的 CN 和相同的密钥(相同的滑动)!(从权威机构下载;与 Mozilla 包含在其产品中的相同)
- 中间 CA 1(与服务器发送的相同)
这适用于当前的证书链,但只是因为我们信任中间 CA 1。如果我们删除它,它会失败,因为服务器 CA X 不受信任。新证书显然不起作用,因为它们是由不同的中间 CA 签名的。
现在,通过阅读 RFC 5280 第 6.1 节,我的印象是我们的 SSL 客户端不遵守标准,因为根据我对证书路径验证的理解(简化):
- 从信任锚开始;验证它是否仍然有效(时间)等。
- 对于以下证书:检查前一个证书的 CN 和密钥是否与当前证书的颁发者 CN 和密钥匹配(并检查 pathlen 约束等...)
- 最后一个证书不能是 CA 证书
关键是:我们的 SSL 客户端无法验证链,因为它被配置为用作信任锚的根证书与服务器提供的根证书具有不同的颁发者。但是,两者的 CN 和 key 是相同的。根据我对 RFC 5280 中所读内容的理解,SSL 客户端不应该关心其信任锚的发布者。链内的证书中也没有定义可以强制执行此类操作的策略。但是,我不知道我们的 SSL 客户端是否会强制执行会导致这种情况的其他策略(不是我的系统)。
所以我的问题是:我们的 SSL 客户端在这种情况下是否正确运行?当然:为什么?
提前致谢
编辑:我知道服务器应该只发送中间 CA 证书而不是根证书,但是,我们使用权威提供的作为证书旁边的 cabundle,其中包括根证书。此外,据我所知,在这种情况下,客户端应该忽略服务器发送的根证书。
同样奇怪的是,客户端的行为就好像它验证了从服务器证书到它可以信任的东西然后停止的链,而规范说它应该验证从信任锚到服务器证书的链。
Edit2:根 CA 证书的不同“版本”都具有相同的 SKID - 它们仅在发行者和序列号方面有所不同(当然)。
另外,刚刚想到,从第一次编辑的信息来看,SSL 客户端似乎需要信任的根证书和链在其发行者中相同,并且可能需要序列号来接受它。