我试图在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上却很吃力。


当前回答

在我的例子中,这个问题的根本原因是空的信任库(它是应用程序服务器信任库)。 当我添加任何虚拟x.509证书时,停止抛出此错误。

将证书添加到truststore vis keytool中

keytool -import -alias dummy -keystore <path to keystore> -storepass <truststore password if any>

其他回答

一些OpenJDK供应商发布的版本通过将空cacerts文件与二进制文件一起分发而导致了这种情况。该错误的解释在这里:https://github.com/AdoptOpenJDK/openjdk-build/issues/555

您可以从c:\Program Files\Java\ jdk1.8.0_192\jre\lib\security\cacerts等旧安装中将该文件复制到adoptOpenJdk8\jre\lib\security\cacerts。

AdoptOpenJDK的错误版本是https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip

我在一篇博客文章中遇到了这个解决方案:在OS X上运行OpenJDK 7时修复trustAnchors问题:

修复在OS X上运行OpenJDK 7时的trustAnchors问题。如果你在OS X上运行OpenJDK 7,并且看到了这个异常:

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

有一个简单的解决办法。只要链接到苹果JDK 1.6使用的cacerts文件:

cd $(/usr/libexec/java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

您需要为已安装的每个OpenJDK版本执行此操作。只需将-v 1.7更改为您想要修复的版本。运行/usr/libexec/java_home -V查看已安装的所有jre和jdk。

也许OpenJDK的人可以把这个添加到他们的安装脚本中。

我在Linux上的Java 9.0.1上有这个错误消息。这是由于JDK的一个已知错误,其中。tar.gz二进制包中的cacerts文件是空的(从http://jdk.java.net/9/下载)。

参见JDK 9.0.1版本说明的“已知问题”段落,说“TLS在OpenJDK 9上默认不工作”。

在Debian/Ubuntu(可能还有其他衍生版本)上,一个简单的解决方法是用"ca-certificates-java"包中的cacerts文件替换cacerts文件:

sudo apt install ca-certificates-java
cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts

在Red Hat Linux/CentOS上,你可以从“ca-certificates”包中做同样的事情:

sudo yum install ca-certificates
cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts

删除ca-certificates-java包并重新安装它对我来说是有效的(Ubuntu MATE 17.10 (Artful Aardvark))。

sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java

谢谢,jdstrand:关于bug 983302的评论1,Re: ca-certificates-java无法在Oneiric Ocelot上安装Java cacerts。

对我来说,这是由于信任存储库中缺少一个trustedCertEntry造成的。

要测试,请使用:

keytool -list -keystore keystore.jks

它给我:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry

即使我的PrivateKeyEntry包含一个CA,它需要单独导入:

keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks

它导入证书,然后重新运行keytool -list -keystore keystore。JKS现在提供:

Your keystore contains 2 entries

cert-alias, 31-Jul-2017, PrivateKeyEntry,
Certificate fingerprint (SHA1): <fingerprint>

root-ca1, 04-Aug-2017, trustedCertEntry,
Certificate fingerprint (SHA1): <fingerprint>

现在它有了一个trustedCertEntry, Tomcat将成功启动。