使用其他PC时SSL验证程序异常

时间:2019-02-13 12:06:47

标签: java ssl keystore artifacts

我构建了一个Java应用程序来测试本地服务器上的数据。服务器正在使用https进行通信。它有一个自签名证书,我将其添加到cacerts中,因此我的应用程序知道它将被接受。

它在我的PC上也可以在其他PC上正常运行,但是一个用户遇到此错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我在互联网上搜索了很多这个问题,但是只能找到一些通过keytool将证书导入到密钥库中的东西。我做了什么。问题是,我无法将证书导入使用该工具的每个Java运行时。

主要问题是,如果我构建构件并在另一台PC上使用它,那么将询问密钥库是否证书有效。我用它构建的一个或安装在用户系统上的一个。如果是更高版本,我如何确保该证书将被接受。

(我不想使用所有方法,等等。只有我想使用的方法)

我使用Apache CloseableHttpClient和JDK 8。

1 个答案:

答案 0 :(得分:1)

  

如果我构建工件并在另一台将使用密钥库的PC上使用它   询问证书是否有效。我建立的那个或一个   已安装在用户系统上。

安装在用户系统上的一个。 没有什么叫生成器密钥库,构建应用程序时,JRE中的cacerts文件不会捆绑到最终的应用程序工件中,该应用程序将默认信任cacerts中存在的所有证书运行该应用程序的运行时中的文件,该文件可以是您构建应用程序的计算机,也可以是其他计算机。

  

我如何确保该证书将被接受。

您可以创建自己的信任库,并告诉Java使用新创建的信任库,而不是位于your_JRE_foler\lib\security\cacerts的默认信任库。

您可以通过JVM系统属性指定自己的信任库。如下:-Djavax.net.ssl.trustStore=/path/to/your/store/my-cacerts,但请注意,由于您不再指向默认的JRE cacerts文件,因此您的应用程序将不再信任所有默认证书。

如果要合并自己的存储和默认的JRE cacerts存储,则需要提供自定义的KeyManager实现,请检查以下答案:Using a custom truststore in java as well as the default one