我试图在Jenkins/Hudson上配置我的电子邮件,但我经常收到错误:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty

我已经在网上看到了关于这个错误的大量信息,但我还没有得到任何工作。我在Fedora Linux上使用Sun的JDK(不是OpenJDK)。

以下是我尝试过的一些方法。我试着按照这篇文章的建议,但是从Windows复制cacerts到我的Fedora盒子托管Jenkins不起作用。我尝试按照这个指南,因为我试图配置Gmail作为我的SMTP服务器,但它也没有工作。我还尝试手动下载并移动这些cacert文件,并使用本指南中的命令的变体将它们移动到我的Java文件夹中。

我愿意接受任何建议,因为我现在被困住了。我已经让它在Windows Hudson服务器上工作了,但在Linux上却很吃力。


当前回答

在我的案例中,客户端应用程序中使用的JKS文件已损坏。我创建了一个新的,并在其中导入了目标服务器SSL证书。然后我在客户端应用程序中使用新的JKS文件作为信任存储,如下所示:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

来源:Java SSL和证书keystore

我使用(KeyStore Explorer)工具创建新的JKS。您可以从这个链接(KeyStore Explorer)下载它。

其他回答

我在使用IBM Websphere JDK keytool在#PKCS12格式中导出的信任库时遇到了这个错误,并试图在Oracle JRE上使用该文件通过SSL进行通信。

我的解决方案是在IBM JRE上运行,或者使用IBM Websphere keytool将信任库转换为JKS,这样我就能够在Oracle JRE中运行它。

Marquis of Lorne的回答是准确的,我添加了一些信息用于调试:

要调试这个问题(我在这里写了更多细节)并了解正在使用(或试图使用)什么信任库,可以添加属性javax.net.debug=all,然后过滤关于信任库的日志。您还可以使用属性javax.net.ssl.trustStore来指定特定的信任库。例如:


    java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/Another/path/to/cacerts -jar test_get_https-0.0.1-SNAPSHOT-jar-with-dependencies.jar https://www.calca.com.py 2>&1| grep -i truststore

System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");

您必须将上述两行代码添加到代码中。无法找到信任存储库。

在Ubuntu 18.04上,我需要使用OpenJDK 1.7来维护一个旧项目。我下载了二进制包。但当我执行我的脚本上,我得到了同样的错误。

解决方案是删除已下载JDK的jre/lib/security文件夹中的cacerts文件,然后将其创建为/etc/ssl/certs/java/系统cacerts文件的符号链接:

Sudo ln -s /etc/ssl/certs/java/cacerts /path/to/ downloading /java/jre/lib/security/cacerts

在Ubuntu 18.04上,根本原因是openjdk-11-jdk(默认值)和依赖于它的其他包之间的冲突。Debian已经修复了这个问题,Ubuntu很快也会修复。同时,最简单的解决方法是将java降级到版本8。使用ca-certificates-java的其他解决方案要复杂得多。

首先删除冲突包:

sudo apt-get remove --purge openjdk* java-common default-jdk
sudo apt-get autoremove --purge

检查您是否成功删除了所有相关的包:

sudo update-alternatives --config java

系统将提示您没有可供配置的Java,否则此解决方案将失败。

然后重新安装所需的软件包:

sudo apt-get install openjdk-8-jdk