来自Java的SSL连接

时间:2010-05-03 18:51:29

标签: java ssl certificate

我正在尝试使用以下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。

2 个答案:

答案 0 :(得分:2)

最有可能的原因是,

  1. 主机B使用自签名证书。
  2. 证书由CA签署,但不在您的信任存储区中。
  3. 证书使用中间证书签名但主机B配置错误,因此它不会发送具有中间证书的服务器证书。
  4. 对于#1,#2,您需要将证书或CA证书导入您的信任存储区。

    对于#3,告诉主机B发送中间证书。

答案 1 :(得分:-1)

这可能是因为您没有证书的有效路径,或者因为您没有CA证书来验证某个类似的公司。