我正在尝试使用以下Java代码进行测试SSL连接:
String httpsURL = "https://www.somehost.com";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream();
InputStreamReader isr=new InputStreamReader(ins);
BufferedReader in =new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
当我连接到主机A时,一切正常 - 建立连接并收到响应。
但是,当我连接到主机B时,我发送的证书由与主机A相同的权限颁发,我收到以下异常:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
到目前为止,我所阅读的所有内容都表明我需要在我的密钥库中安装证书,但如果这是解决方案,那么为什么Host A可以正常工作而Host B却没有?
作为一个可能没有用的东西 - 如果我写一个类似的C#代码,那么主机A和B的连接成功协商 - 这同样适用于在浏览器中导航到URL。
答案 0 :(得分:2)
最有可能的原因是,
对于#1,#2,您需要将证书或CA证书导入您的信任存储区。
对于#3,告诉主机B发送中间证书。
答案 1 :(得分:-1)
这可能是因为您没有证书的有效路径,或者因为您没有CA证书来验证某个类似的公司。