使用其他 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
我构建了一个 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