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

SSL Validator Exception when using other PC

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

它在我的电脑和其他一些电脑上工作得很好,但是一个用户遇到这个错误:

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.

if I build an artifact and use it on another PC which keystore will be asked if certificate is valid. The one I build it with or the one which is installed on the system of user.

安装在用户系统上的那个。 没有所谓的构建器密钥库,当您构建应用程序时,JRE 中的 cacerts 文件不会捆绑到您的最终应用程序工件中,应用程序将默认信任 cacerts 中存在的所有证书在 runtime 处创建应用程序 运行 的文件,它可以是您构建应用程序的同一台机器,也可以是不同的机器。

how can I assure that the certificate will be accepted.

您可以创建自己的 truststore 并告诉 java 使用新创建的 truststore 而不是默认的位于 your_JRE_foler\lib\security\cacerts.

您可以通过 JVM 系统属性指定自己的 truststore,例如如下所示:-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