Chrome浏览器如何知道为哪个站点提示客户端证书?

33

我正在使用Tomcat为我的项目设置证书认证。对于像cURL这样的命令行客户端,它可以正常工作。

我在Chrome浏览器中安装了许多客户端证书。有些用于连接到我的网站,其他证书用于不同的目的,与我的项目无关。

每次我连接到我的网站时,Chrome都会呈现可供选择的客户端证书列表。这些正是我安装的证书,而不是其他证书。我的问题如下:

  1. Chrome如何知道要为哪个网站呈现哪些客户端证书供选择?
  2. Tomcat将这些客户端证书存储在其信任存储区中。在SSL握手期间,Tomcat将请求客户端证书。它是否请求已知的特定证书,以便Chrome知道显示哪些证书?
1个回答

46

客户端证书身份验证是浏览器实现的 SSL/TLS 协议握手阶段中的一个规则。

  1. 如果服务器要求客户端证书身份验证(这是可选的),则向客户端发送接受的证书颁发机构(CA)列表。如果服务器接受任何证书,则可能为空。

  2. 客户端从已由这些 CA 颁发的客户端密钥库中选择证书,并将列表呈现给用户。在 Chrome 中,浏览器从操作系统的密钥库中选择用户安装的证书。

  3. 用户选择一个证书,客户端使用证书的私钥对握手期间交换的已知数据执行签名。

在第二步中只能选择具有私钥的证书。这就是为什么浏览器不会选择安装在设备上的受信任 CA 的证书的原因。您不拥有私钥。


1
我认为1和2回答了我的问题。我还进行了调查,证实了这一点,因此接受这个解决方案。谢谢。 - System
谢谢。在我的情况下,我有两个客户端证书。当我访问某些网站时,Chrome的对话框允许我选择其中一个。当我访问其他网站时,Chrome的对话框只显示一个。我想知道为什么另一个被省略了。CA列表(#1 /#2)的解释符合这种行为,所以它一定是真的! :-) - dashrb
1
在第二步,您能否提供更多细节,关于握手期间的“已知数据交换”是什么? - Carlos Eduardo Ki Lee
2
@CarlosEduardoKiLee,请查看 https://tools.ietf.org/html/rfc5246#section-7.4.8。客户端对所有先前发送或接收的握手消息进行数字签名。 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接