自签名的根CA不适用于Java

时间:2016-03-07 15:02:51

标签: java ssl

我认为这与this one之类的问题重复,因为证书可以被java识别。

出于测试目的,我已经生成了一个自己的root-CA和这样的证书:

拥有根CA - >中间CA - >我的证书

我用它创建了一个密钥库,并且我成功地在我的java服务器中使用该密钥库来提供加密内容(在Eclipse应用程序中使用Jetty)。我可以使用SSL和Firefox(在添加中级CA之后)调用我的rest-api就好了,一切正常。

但是,我无法从另一个Java应用程序(使用javax.ws.rs)调用我的Rest-API,因为证书链似乎是错误的。

  

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

如果我检查异常详细信息,我可以看到SunCertPathBuilderException包含我的客户端证书和中间CA证书,但不包含Root-CA证书(在字段adjList中)。

为什么应用程序找不到Root-CA?我想这是问题所在,但是密钥库中的Root-CA ,我使用相同的服务器密钥库,所以我知道它应该是正确的。

1 个答案:

答案 0 :(得分:1)

客户端需要指定 trustStore 而不是 keyStore ,例如:

    Path trustStorePath = ...;
    System.setProperty("javax.net.ssl.trustStore", trustStorePath.toString());
    System.setProperty("javax.net.ssl.trustStorePassword", "<some password>");

您可以使用以下系统属性获取有关SSL配置的更多信息:

   System.setProperty("javax.net.debug", "ssl");