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


当前回答

对我来说,这是由于信任存储库中缺少一个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将成功启动。

其他回答

在升级到Spring Boot 1.4.1(或更新版本)后也可能遇到此错误,因为它将Tomcat 8.5.5作为其依赖项的一部分。

问题在于Tomcat处理信任存储的方式。如果恰好在Spring Boot配置中指定了信任存储库位置与密钥存储库相同,那么在启动应用程序时可能会得到trustAnchors参数必须为非空的消息。

server.ssl.key-store=classpath:server.jks
server.ssl.trust-store=classpath:server.jks

只需删除server.ssl。信任存储配置,除非您知道您需要它,在这种情况下,请参考下面的链接。

以下问题包含该问题的详细信息:

HTTPS Tomcat连接器以1.4.1 #7069启动失败 带有自签名证书的SSL-client-auth停止工作#7406 升级到Tomcat 8.5.5 #6703

在Ubuntu 12.10 (Quantal Quetzal)或更高版本中,证书保存在ca-certificates-java包中。使用-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts将获取它们,不管你使用的是什么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的最新版本中找到证书的有效版本。

我希望出现这样的情况,因为我在Talend Open Studio中使用了另一个JVM(目前只支持JDK 1.7)。出于安全考虑,我使用8。无论如何

更新您的证书存储: Sudo update-ca-certificates -f

then

在初始化参数中添加一个新值 sudo gedit $(到你的体系结构特定的ini的路径,例如TOS_DI…ini) Djavax.net.ssl.trustStore = / etc / ssl /证书/ java /除

对我来说,第二项成功了。我认为,根据Talend Open Studio/TEnt + JVM的版本,它有不同的参数名称,但它查找相同的keystore文件。

对我来说,这是由于信任存储库中缺少一个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将成功启动。