我试图在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上却很吃力。
我在一篇博客文章中遇到了这个解决方案:在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的人可以把这个添加到他们的安装脚本中。
该错误表明系统无法在参数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的最新版本中找到证书的有效版本。
当我发送电子邮件时,我得到了同样的错误,但并不总是。在我的例子中,我改变了一行代码来每次获得一个新的Session对象:
MimeMessage message = new MimeMessage(Session.getDefaultInstance(props, authenticator));
to
MimeMessage message = new MimeMessage(Session.getInstance(props, authenticator));
从那以后,每次发电子邮件都很有效。
我得到的错误是:
javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is: javax.net.ssl.SSLException:
java.lang.RuntimeException: Unexpected error:
java.security.InvalidAlgorithmParameterException: the trustAnchors
parameter must be non-empty at
com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907) at
com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)
at javax.mail.Service.connect(Service.java:317) at
javax.mail.Service.connect(Service.java:176) at
javax.mail.Service.connect(Service.java:125) at
javax.mail.Transport.send0(Transport.java:194) at
javax.mail.Transport.send(Transport.java:124)
在升级到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
对我来说,这是由于信任存储库中缺少一个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将成功启动。
我在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
我在网上找到的解决办法都没用,但彼得·克里恩斯(Peter Kriens)的答案的修改版本似乎管用。
首先运行/usr/ libeexe /java_home找到Java文件夹。对我来说,它是1.6.0。jdk版本。然后转到它的lib/security子文件夹(对我来说/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security)。
然后删除cacerts文件(如果已经有),然后使用sudo find / name "cacerts"在系统中搜索。它为我找到了多个项目,在我安装的Xcode或其他应用程序版本中,也在/Library/Internet plug - in /JavaAppletPlugin中。plugin/Contents/Home/lib/security/cacerts。
使用该文件并对其进行符号链接(在之前的Java文件夹中),sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin. exe "。plugin/Contents/Home/lib/security/cacerts”,它应该可以工作。
我两者都有——Java从苹果的2017-001下载(https://support.apple.com/kb/dl1572 -我假设这是正确的证书来源)和Oracle的安装在Mac OS X v10.12 (Sierra)上的证书。
在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
在ubuntu 14.04和openjdk 11 from ppa:openjdk-r/ppa上,这对我来说是有效的:
在java中。安全性将密钥库类型更改为
keystore.type=jks
然后:
sudo dpkg --purge --force-depends ca-certificates-java
sudo apt-get install ca-certificates-java
当您检查它是否工作时,请确保您使用的守护进程中没有任何旧的Java仍在运行(例如。——gradle的no-daemon选项)
这个bug很好地描述了所有内容,并将帮助您理解正在发生的事情https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631
我发现了这个错误的另一个原因,这与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
除了....,这对任何人都没有帮助对于任何在树莓派(使用AMD CPU)上从Docker镜像运行Java 8的人来说,我得到了以下Dockerfile,为我成功地构建和运行
FROM hypriot/rpi-java
USER root
WORKDIR /usr/build/
RUN /usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts
RUN update-ca-certificates -f
RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure
EXPOSE 8080
ARG JAR_FILE=target/app-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Djavax.net.ssl.trustStorePassword=changeit", "-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts", "-jar", "app.jar"]
我是可移植性的粉丝,所以我不安装java,只是下载tar.gz并导出路径中的一些值,一切都可以工作。
我与这个问题作斗争,没有解决方案(安装或更新操作系统证书)对我有效。
在我的情况下的错误是:空cacerts在我的jdk。
我不知道为什么,但是我的jdk.tar.gz有一个空的cacerts文件
/ . ./some_openjdk/jre/lib/security/cacerts size: 32字节
下载:
https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
https://download.java.net/java/GA/jdk9/9/binaries/openjdk-9_linux-x64_bin.tar.gz
Fix
经过几次尝试,我找到了一个正确的jdk.tar.gz,其中包含一个101 KB大小的cacerts文件
我从https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries下载了这个开放jdk
https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u262-b10/OpenJDK8U-jdk-jfr_x64_linux_8u262b10.tar.gz
我在这个Dockerfile中找到了这个url:
https://github.com/docker-library/openjdk/blob/b5d14d9165fad693901c285d6e7bbc36d1cde41f/8/jdk/Dockerfile