SSL Validator使用其他PC时出现异常

问题描述 投票:0回答:1

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

它适用于我的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。

java ssl keystore artifacts
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.