有一台服务器只发送自己的证书而且链中没有发行者(注意:它不是自签名的)。
当我在谷歌浏览器中连接到此服务器并查看证书时,我在“证书路径”选项卡中看到完整链,但当我尝试使用Java连接到此服务器时,我使用-Djavax.net.debug=SSL
我只看到服务器自己的证书。
我注意到此证书上有一个名为“Authority Info Access”的扩展,其中包含一个字段“Alternative Name”,其URL指向颁发者的证书。我相信Chrome(或Windows可能)“意识到”这个扩展并且Java没有“意识到”,有没有办法在Java中使用它? (最好没有额外的课程,但我意识到如果它没有内置,可能没有简单的方法。)
如果我只将根证书添加到Java的cacerts,那么我无法执行TLS握手(因为服务器只发送自己的证书,而root没有发出它,中间做了)。这个服务器不受我的控制,我不能让它发送中间证书。由于Chrome能够解析中间问题(通过AIA我想),我怀疑可能有一种方法可以在Java中执行此操作而无需将中间证书添加到cacerts文件,只有root,但我不知道如何使Java使用此AIA扩展来获取中间证书。
答案 0 :(得分:3)
您需要设置相关的系统属性,以使Java App能够下载根的中间证书。
System.setProperty("com.sun.security.enableAIAcaIssuers", "true");