我试图在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上却很吃力。
在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
该错误表明系统无法在参数javax.net.ssl.trustStore提供的路径中找到信任库。
在Windows下,我将jre/lib/security中的cacerts文件复制到Eclipse安装目录(与Eclipse .ini文件相同的位置),并在Eclipse .ini中添加以下设置:
-Djavax.net.ssl.trustStore=cacerts
-Djavax.net.ssl.trustStorePassword=changeit
-Djavax.net.ssl.trustStoreType=JKS
我在cacerts的路径上遇到了一些问题(%java_home%环境变量以某种方式被覆盖了),所以我使用了这个简单的解决方案。
其思想是提供信任库文件的有效路径——理想情况下是使用相对路径。也可以使用绝对路径。
要确保存储类型为JKS,您将运行以下命令:
keytool -list -keystore cacerts
Keystore type: JKS
Keystore provider: SUN
注意:由于证书有过期日期,或可能因其他原因失效,请不时检查cacerts中的证书是否仍然有效。您通常会在jdk的最新版本中找到证书的有效版本。
对我来说,这是由于信任存储库中缺少一个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将成功启动。