在SSL握手期间,浏览器会根据需要使用提供的URL从主机Web服务器下载任何中间证书。我相信浏览器附带了公共CA的预安装证书,这些证书只有根证书的公钥。
1)当使用独立的java程序[https://xyz.com ..正在使用Verisign证书]调用https url时,我不需要将该证书添加到任何信任库,因为它的根公开已经在jdk中可用cacerts信任库文件。这是正确的陈述吗?
2)当我从应用程序服务器运行相同的程序时,它需要将所有中间证书分别添加到服务器信任库。为什么这会以不同的方式运作。
答案 0 :(得分:1)
如果服务器证书的信任链是:root-intermediate#1-intermediate#2-server且客户端(浏览器)在其CA存储中将root用作可信CA,则需要一种方法来验证服务器证书检查完整的链到根。并且因为客户端通常不了解服务器需要提供的中间CA.
有时它似乎无法提供这些中间CA.首先,浏览器通常会缓存他们获得的中间CA,因此如果中间#2与另一台服务器已经看到的相同,则验证将成功,但仅适用于之前访问过其他服务器的客户端:(
另一种方法是在证书内提供URL,其中可以下载发行者证书,例如,服务器可以为中间#2的证书提供链接,中间#2可以提供到中间#1的链接。在这种情况下,客户端可以下载丢失的证书。但是,这种特征并未普遍采用,例如,某些浏览器可能会提供它,但浏览器之外的SSL库通常不提供它。