今天,我注意到 OpenSSL 和浏览器(Firefox、Chrome)为网站提供了不同的证书链。OpenSSL 显示来自“GTE CyberTrust Global Root”的根证书,而 Firefox 和 Chrome 显示“Baltimore CyberTrust Root”的根证书。以下是运行“openssl”后输出的证书链:
openssl s_client -connect "WEBSITE.com:443" -servername WEBSITE.com
...
...
Certificate chain
0 s:/C=US/ST=NY/L=New York/O=Company/OU=Company/CN=*.WEBSITE.com
i:/C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Akamai SureServer CA G14-SHA2
1 s:/C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Akamai SureServer CA G14-SHA2
i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
2 s:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
i:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc./CN=GTE CyberTrust Global Root
“GTE CyberTrust Global Root” 是 1024 位证书。(由于 1024 位证书已弃用,因此这可能会带来问题)
在我的浏览器中,如果我查看 WEBSITE.com 的证书层次结构,它会显示“Baltimore CyberTrust Root”是根证书。(它是 2048 位的,很好!)
有趣的是,如果我在浏览器中查看“Baltimore CyberTrust Root”的“发行者”,则该发行者就是它自己。另一方面,OpenSSL 表明它是由“GTE CyberTrust Global Root”发行的。
为什么浏览器告诉我“Baltimore CyberTrust Root”是根证书,而 openssl 告诉我“GTE CyberTrust Global Root”是根证书?是什么导致了这种差异?
答案1
交叉认证解释了其中的差异。
请记住,证书只是主体名称和公钥的唯一组合。
在您的浏览器的信任锚列表中,主题名称为“Baltimore CyberTrust Root”且公钥为 A 的证书已由其自身签名,因此是自签名根证书。
在您的 OpenSSL 信任锚列表中,主题名称为“Baltimore CyberTrust Root”且公钥为 A 的证书已由“GTE CyberTrust Global Root”签名。从逻辑上讲,这与浏览器使用的证书相同,尽管它不是自签名的,而是由上级根(在层级意义上是上级,而不是密钥长度)签名的。
SSL 库开发人员(微软,Mozilla、OpenSSL 等)管理自己的信任锚列表;这就是为什么您会看到从最终实体证书到信任锚的不同路径。
因此,历史就是它们不同之处。Mozilla已删除Firefox 36 发布时,NSS 中的“GTE CyberTrust Global Root”。微软可能也在同一时间将其删除。您的 OpenSSL 版本仍保留它。大约在同一时间,Mozilla 和微软可能会添加来自“Baltimore CyberTrust Root”的自签名根 CA 证书,以便证书链构建仍然有效。
由于您没有提到您使用哪种浏览器,也没有提到 OpenSSL 的版本和平台,因此很难给出更精确的答案。