我试图在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无关。

我尝试在Spring boot 2应用程序中设置相互TLS,在使用只有私钥条目而没有受信任证书条目的信任库后遇到了这个问题。

这是我的Spring Boot TLS配置

server.port=8443
server.ssl.key-alias=oba-tls
server.ssl.key-password=mypw
server.ssl.key-store-password=mypw
server.ssl.key-store=classpath:keys/tls-keystore.pfx
server.ssl.key-store-type=PKCS12
server.ssl.enabled=true
server.ssl.client-auth=need

server.ssl.trust-store=classpath:keys/truststore.pfx
server.ssl.trust-store-password=mypw
server.ssl.trust-store-type=PKCS12
server.ssl.ciphers=ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA384
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.2

用于生成信任库。我必须使用以下命令使其工作。

openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -out cert.crt

keytool -importcert -alias oba-trust -file cert.crt -keystore truststore.jks

keytool -importkeystore -srckeystore truststore.jks -destkeystore truststore.pfx -srcstoretype JKS - deststoretype PKCS12 -deststorepass yourpassword

其他回答

如果你在使用JDK9和Maven的Ubuntu上遇到这种情况,你可以添加这个JVM选项-首先检查路径是否存在:

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

如果文件丢失,尝试安装ca-certificates-java,就像有人指出的那样:

sudo apt install ca-certificates-java

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

我在一篇博客文章中遇到了这个解决方案:在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的人可以把这个添加到他们的安装脚本中。

我发现了这个错误的另一个原因,这与Ubuntu无关。

我尝试在Spring boot 2应用程序中设置相互TLS,在使用只有私钥条目而没有受信任证书条目的信任库后遇到了这个问题。

这是我的Spring Boot TLS配置

server.port=8443
server.ssl.key-alias=oba-tls
server.ssl.key-password=mypw
server.ssl.key-store-password=mypw
server.ssl.key-store=classpath:keys/tls-keystore.pfx
server.ssl.key-store-type=PKCS12
server.ssl.enabled=true
server.ssl.client-auth=need

server.ssl.trust-store=classpath:keys/truststore.pfx
server.ssl.trust-store-password=mypw
server.ssl.trust-store-type=PKCS12
server.ssl.ciphers=ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA384
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.2

用于生成信任库。我必须使用以下命令使其工作。

openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -out cert.crt

keytool -importcert -alias oba-trust -file cert.crt -keystore truststore.jks

keytool -importkeystore -srckeystore truststore.jks -destkeystore truststore.pfx -srcstoretype JKS - deststoretype PKCS12 -deststorepass yourpassword

这个奇怪的消息意味着您指定的trustStore是:

空的, 未找到,或 无法打开 (由于错误/缺少trustStorePassword,或 例如,文件访问权限)。

参见下面@AdamPlumb的回答。