46

我遇到了一个问题并试图调试它。我们购买了威瑞信证书。当我们使用:

openssl> s_client -connect myweb.com:443 -showcerts

SSL 握手永远不会完成,最后我们看到错误:

Verify return code: 19 (self signed certificate in certificate chain)

它显示 3 个---BEGIN/END CERTIFICATE---标签。链中的两个证书是 Verisign 签名的,但一个是自签名的。

  1. 如果有人可以请解释这个自签名证书如何出现在 CA 签名证书中?

  2. 这个错误是19 (self signed certificate in certificate chain)良性的吗?如果不是,可能是什么原因造成的?

  3. 客户端在受信任的存储中拥有 CA 证书,但自签名证书没有任何内容。你认为这会导致问题吗?如果是,我该如何:

    1. 如何从链证书中删除自签名证书,只留下 2 个 CA 签名证书?
    2. 将此自签名证书添加到客户端受信任的商店?
4

5 回答 5

78

CA 颁发的根证书只是自签名证书(可以反过来用于颁发中间 CA 证书)。它们并没有什么特别之处,只是它们已在许多浏览器或操作系统信任锚中默认导入。

虽然浏览器和一些工具默认配置为在位置查找受信任的 CA 证书(其中一些可能是自签名的),但据我所知,该openssl命令不是。

因此,任何提供完整证书链的服务器,从其最终实体证书(服务器的证书)到根 CA 证书(可能带有中间 CA 证书)都将在链中拥有一个自签名证书:根 CA .

openssl s_client -connect myweb.com:443 -showcerts没有任何特别的理由信任 Verisign 的根 CA 证书,并且因为它是自签名的,您将获得“证书链中的自签名证书”。

如果你的系统有一个默认信任的证书包的位置(我认为/etc/pki/tls/certs在 RedHat/Fedora 和/etc/ssl/certsUbuntu/Debian 上),你可以配置 OpenSSL 将它们用作信任锚,例如:

openssl s_client -connect myweb.com:443 -showcerts -CApath /etc/ssl/certs
于 2010-11-05T13:28:14.000 回答
9

听起来中间证书丢失了。 自 2006 年 4 月起,VeriSign 颁发的所有 SSL 证书都需要安装中间 CA 证书。

可能是您的服务器上没有加载整个证书链。一些企业不允许他们的计算机下载额外的证书,导致无法完成 SSL 握手。

以下是有关中间链的一些信息:
https ://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657
https://knowledge.verisign.com/support/ssl-certificates-support /index?page=content&id=AD146

中级 CA 证书

于 2010-11-05T04:05:13.230 回答
5

关于服务器是否可以向客户端提供根证书,从 RFC-5246 'The Transport Layer Security (TLS) Protocol Version 1.2' 文档中提取,它说:

certificate_list
这是证书的序列(链)。发件人的证书必须在列表中排在第一位。后面的每个证书必须直接证明它前面的证书。因为证书验证要求根密钥是独立分发的,所以可以从链中省略指定根证书颁发机构的自签名证书,
假设远程端必须已经拥有它才能在任何情况下验证它。

关于从 RFC-2119“最佳当前实践”中提取的术语“可能”说:

5.MAY
这个词,或者形容词“OPTIONAL”,意味着一个项目是真正的可选的。一个供应商可能会选择包含该项目,因为
特定市场需要它,或者因为供应商认为
它增强了产品,而另一个供应商可能会省略相同的项目。
不包含特定选项的实现必须
准备好与另一个
包含该选项的实现互操作,尽管功能可能有所减少。同样,包含特定选项的实现
必须准备好与
不包含该选项的另一个实现互操作(当然,
选项提供的功能除外。)

总之,根可能在握手中服务器传递的证书路径上。

一个实际的用途。
考虑一下,不是在导航器用户方面,而是在互联网访问受限的军事化区域的服务器上的传输工具上。
服务器在传输时扮演客户端角色,从服务器接收所有证书路径。
应检查链中的所有证书是否受信任,包括根。
检查这一点的唯一方法是在传输时间将根包含在证书路径中,与之前声明为“受信任”的本地副本进行匹配。

于 2013-07-03T15:09:10.560 回答
3

这是 VeriSign 的 SSL 证书安装检查器的链接:https ://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR1130

输入您的 URL,单击“测试此 Web 服务器”,它会告诉您中间证书颁发机构是否存在问题。

于 2012-03-16T12:38:52.140 回答
1

当你看到“ Verify return code: 19 (self signed certificate in certificate chain)”时,要么服务器真的在尝试使用自签名证书(客户端永远无法验证),要么 OpenSSL 没有访问必要的根,但服务器是试图自己提供它(它不应该这样做,因为它毫无意义——客户端永远不能信任服务器来提供与服务器自己的证书相对应的根)。

同样,添加 -showcerts 将帮助您诊断哪个。

于 2012-10-11T09:42:52.283 回答