我们有一个基于Java的应用程序,可以通过https连接到几个服务器。
这些服务器的自签名证书已添加到客户端信任存储区,以确保https连接正常。
这是有问题的场景:
服务器具有带有公共密钥Pub1的自签名证书C1。该证书已添加到客户端信任存储中,并且连接正常。
在服务器说C2上生成一个新的自签名证书,该证书具有与C1相同的公钥。即C2具有不同的序列号,指纹,有效日期,但具有与证书C1相同的公钥。
尽管C2未添加到客户端信任存储中,但是客户端和服务器之间的连接仍在工作。
因此,看来X509TrustManager / X509ExtendedTrustManager checkServerTrusted实现仅在进行公钥匹配。
使用浏览器测试过的相同场景:
未将服务器的自签名证书C1添加到浏览器证书存储中时,浏览器将引发安全异常。对于Firefox(添加服务器例外)和Chrome浏览器(将自签名服务器证书添加到信任存储)。
浏览器现在不会引发任何安全异常。
如前所述,当服务器更改为具有与C1相同的公钥(已添加到浏览器)的证书C2时,浏览器仍会引发安全异常。
实际上,Java v / s浏览器信任行为有所不同。