参数Error - trustAnchors必须非空

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

856215 次浏览

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

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

参见@AdamPlumb的下面的回答

我在博客修复在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的人可以把这个添加到他们的安装脚本中。

12.10 Ubuntu  (Quantal Quetzal)或更高版本中,证书保存在ca-certificates-java包中。无论使用什么JDK,使用-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts都会捕获它们。

我在OS X上使用JDK 1.7,在升级到OS  X v10.9 (Mavericks)后遇到了这个问题。对我来说有效的解决方法是简单地重新安装苹果版本的Java,可以在http://support.apple.com/kb/DL1572上找到。

在更新OS X v10.9 (Mavericks)后,我在OS X上也遇到了这种情况,当时正在使用旧的Java 6,并试图访问HTTPS URL。修复方法与彼得·克里恩斯(Peter Kriens)相反;我需要将cacerts从1.7空间复制到1.6版本链接的位置:

(as root)
umask 022
mkdir -p /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
cp $(/usr/libexec/java_home -v 1.7)/jre/lib/security/cacerts \
/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security

升级到OS  X v10.9(小牛)后,我遇到了很多安全问题:

  • 亚马逊AWS的SSL问题
  • 未使用Maven和Eclipse验证Peer
  • trustAnchors参数必须非空

我应用了这个Java更新,它修复了我所有的问题:http://support.apple.com/kb/DL1572?viewlocale=en_US

EJP基本上回答了这个问题(我意识到这有一个公认的答案),但我只是处理了这个边缘情况,并想让我的解决方案永垂不朽。

我在托管的Jira服务器上有InvalidAlgorithmParameterException错误,我之前为仅ssl访问设置了该服务器。问题是我用PKCS#12格式设置了密钥存储库,但我的信任存储库是JKS格式。

在我的例子中,我编辑了server.xml文件,将keystoreType指定为PKCS,但是我没有指定truststoreType,因此它默认为keystoreType。明确指定truststoreType作为JKS为我解决了这个问题。

我在IntelliJ IDEA 14中导入Gradle项目时遇到了这个问题。 解决方案是使用Gradle的本地副本,而不是项目目录中的包装器

在Red Hat Linux上,我通过将证书导入/etc/pki/java/cacerts解决了这个问题。

这为我解决了Ubuntu上的问题:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

(在这里找到:https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760)

ca-certificates-java不是Oracle JDK/JRE中的依赖项,因此必须显式安装。

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

  • 更新您的证书存储:

    sudo update-ca-certificates -f
    

then

  • add a new value in your initialization parameters

    sudo gedit $(path to your architecture specific ini i.e. TOS_DI...ini)
    
    
    Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts
    

For me, the second entry worked. I think, depending on the version of Talend Open Studio/TEnt + JVM, it has a different parameter name, but it looks for the same keystore file.

我跑

sudo update-ca-certificates -f

创建证书文件,然后:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

我又开始工作了,谢谢各位。很遗憾,它没有包括在安装中,但我最终做到了。

在我的案例中,客户端应用程序中使用的JKS文件已损坏。我创建了一个新的,并在其中导入了目标服务器SSL证书。然后我在客户端应用程序中使用新的JKS文件作为信任存储,如下所示:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

来源:# EYZ0

我使用(KeyStore Explorer)工具创建新的JKS。您可以从这个链接密钥存储库浏览器下载它。

该错误表明系统无法在参数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

请注意:因为证书有过期日期,或者可能因为其他原因而失效,所以要不时检查中的证书是否仍然有效。您通常会在jdk的最新版本中找到证书的有效版本。

System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");

您必须将上述两行代码添加到代码中。无法找到信任存储库。

当我发送电子邮件时,我得到了同样的错误,但总是。在我的例子中,我改变了一行代码,每次都获得一个新的会话对象:

MimeMessage message = new MimeMessage(Session.getDefaultInstance(props, authenticator));

MimeMessage message = new MimeMessage(Session.getInstance(props, authenticator));

从那以后,每次发电子邮件都很有效。

我得到的错误是:

< p > javax.mail。MessagingException:无法将套接字转换为TLS;
嵌套异常是:javax.net.ssl.SSLException:
java.lang.RuntimeException: Unexpected error:
java.security.InvalidAlgorithmParameterException: the trustAnchors
参数在
处必须非空 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
java .mail. transport .send0(Transport.java:194) at
javax.mail.Transport.send (Transport.java: 124 )
< / p >

在Ubuntu上:

Sudo apt安装ca-certificates-java

Sudo apt-get install ca-certificates-java

帮我整理好了。

另一个原因是它实际上是一个有效的错误。一些恶意的Wi-Fi热点会混淆证书和中间人攻击,谁知道你会做什么(逃跑!)

一些大的雇主也会做同样的事情,特别是在敏感的网络区域,这样他们就可以监控所有的加密流量(从最终用户的角度来看不是很好,但这样做可能有很好的理由)。

我在使用IBM Websphere JDK keytool在#PKCS12格式中导出的信任库时遇到了这个错误,并试图在Oracle JRE上使用该文件通过SSL进行通信。

我的解决方案是在IBM JRE上运行,或者使用IBM Websphere keytool将信任库转换为JKS,这样我就能够在Oracle JRE中运行它。

声明一下,这里没有一个的答案对我很有用。我的Gradle构建开始出现这个错误,无法从Maven 中央获取特定的砰的一声文件的HEAD。

结果发现,我将JAVA_HOME设置为我自己构建的OpenJDK,这是我为调试javac问题而构建的。将它设置回安装在我系统上的JDK就可以解决这个问题。

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

问题在于Tomcat处理信任存储的方式。如果您碰巧在Spring Boot配置中指定了与密钥库相同的信任存储位置,那么在启动应用程序时可能会得到trustAnchors parameter must be non-empty消息。

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

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

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

  • # EYZ0 # 7069
  • # EYZ0 # 7406
  • # EYZ0 # 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# EYZ0:

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将成功启动。

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

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

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

sudo apt install ca-certificates-java

我在14.04 Ubuntu  (Trusty Tahr)上运行一套特定的Android测试时遇到了这个问题。根据shaheen的建议,有两件事对我有用:

sudo update-ca-certificates -f


sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

对我来说,它只是通过升级Jenkins插件“电子邮件扩展插件”到最新版本(2.61)来解决的。

这两个插件负责Jenkins中的电子邮件配置:

  • 电子邮件扩展
  • 邮件扩展模板

我在互联网上找到的解决方案都不起作用,但彼得·克里恩斯的回答的修改版本似乎可以完成这项工作。

首先运行/usr/libexec/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-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts

使用该文件并创建到它的符号链接(在之前的Java文件夹中)sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts",它应该可以工作。

我两者都有——Java从苹果的2017-001下载(https://support.apple.com/kb/dl1572 -我假设这是正确的证书来源)和Oracle的安装在Mac OS X v10.12 (Sierra)上。

我在尝试使用Maven 3时遇到了这个问题,从16.04 Ubuntu  LTS (Xenial Xerus)升级到18.04 Ubuntu  LTS(仿生海狸)。

检查/usr/lib/jvm/java-8-oracle/jre/lib/security显示我的cacerts文件是一个指向/etc/ssl/certs/java/cacerts的符号链接。

我还有一个名为cacerts.original的文件。

我将cacerts.original重命名为cacerts,这解决了这个问题。

删除ca-certificates-java包并重新安装它对我来说是有效的(Ubuntu的伴侣 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失败

Ubuntu 18.04中,这个错误有不同的原因(JEP 229,从jks密钥库默认格式切换到pkcs12格式,Debian cacerts文件生成使用默认的新文件)和解决方案:

# Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
# Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
# create that file from scratch, like Debian / Ubuntu do.
#
# Before applying, run your application with the Java command line parameter
#  java -Djavax.net.ssl.trustStorePassword=changeit ...
# to verify that this workaround is relevant to your particular issue.
#
# The parameter by itself can be used as a workaround, as well.


# 0. First make yourself root with 'sudo bash'.


# 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
#    Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
/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


# 2. Re-add all the CA certs into the previously empty file.
/var/lib/dpkg/info/ca-certificates-java.postinst configure

状态(2018-08-07),这个bug在Ubuntu Bionic LTS 18.04.1和Ubuntu Cosmic 18.10中已经修复。


🗹# EYZ0

🗹# EYZ0

🗹# EYZ0

🗹# EYZ0

🗹# EYZ0

🗹# EYZ0

🖺# EYZ0


如果在此解决方法之后问题仍然存在,您可能希望确保您实际上正在运行刚刚修复的Java发行版。

$ which java
/usr/bin/java

你可以通过以下方法将Java选项设置为'auto':

$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so

你可以再次检查你正在执行的Java版本:

$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

当然也有其他的解决方法,但这些方法都有自己的副作用,需要额外的未来维护,而且没有任何回报。

次佳的解决方法是添加行

javax.net.ssl.trustStorePassword=changeit

到文件

/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties

任何一个存在。

的值是第三个问题最小的解决方法

keystore.type=pkcs12

keystore.type=jks

在文件中

/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security

然后删除cacerts文件,并按照文章顶部工作区脚本最后一行中描述的方式重新生成它。

在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

我在使用Android SDK sdkmanager时遇到了这个问题。对我来说,这个解决方案是有效的:

  1. 转到/usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. cacert.original替换cacert

cacert文件很小(22B)。我已经从ppa:webupd8team/java安装了oracle-java8-installer(根据本手册:https://docs.nativescript.org/start/ns-setup-linux)。

一些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

在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仍在运行(例如。--no-daemon选项gradle)

这个bug很好地描述了一切,并将帮助你理解https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631上发生了什么

在Ubuntu 18.04上,我需要使用OpenJDK 1.7来维护一个旧项目。我下载了二进制包。但当我执行我的脚本上,我得到了同样的错误。

解决方案是删除已下载JDK的jre/lib/security文件夹中的cacerts文件,然后将其创建为/etc/ssl/certs/java/文件夹中cacerts文件的符号链接:

# EYZ0

我发现了这个错误的另一个原因,这与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

我遇到了同样的错误,问题不在于配置JDK,而是在trust-store:参数下的application.properties文件中JKS文件的路径错误,请再次检查路径是否正确。

我跑

sudo update-ca-certificates -f

创建证书文件,然后:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure`

然后修改jar执行的命令行:

sudo java -cp xx.jar:lib/* co.com.ixxx.clixxxlarxa.Main

对于我的情况,我没有完全指定VM参数。

(# EYZ0)

确保所有VM参数设置正确。

除了....,这对任何人都没有帮助对于任何在树莓派(使用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密钥存储库 进入chrom,打开网站,以txt格式保存证书

2 .执行cmd> keytool -import -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias Root -import -file Trustedcaroot.txt

https://knowledge.digicert.com/solution/SO4085.html

这招很管用

使用亚马逊SDK v2, Windows 10和JDK8。 Amazon SDK抱怨凭证加载。
我通过用JDK11替换JDK8的security/cacert文件来解决这个问题

我是可移植性的粉丝,所以我不安装java,只是下载tar.gz并导出路径中的一些值,一切都可以工作。

我与这个问题作斗争,没有解决方案(安装或更新操作系统证书)对我有效。

错误在我的情况下是:jdk中的空cacerts。

我不知道为什么,但是我的jdk.tar.gz有一个空的cacerts文件

# EYZ0 # EYZ1

下载:

修复

经过几次尝试,我找到了一个正确的jdk.tar.gz与文件大小101 KB

我从https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries下载了这个开放jdk

我在这个Dockerfile中找到了这个url:

洛恩侯爵的回答是准确的,我添加了一些信息用于调试:

要调试这个问题(我在在这里中详细介绍了这个问题)并了解正在使用(或试图使用)什么信任库,可以添加房地产 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


在我的情况下,这个问题的根本原因是空的信任库(它是应用程序服务器信任商店)。 当我添加任何伪x.509证书时,然后停止抛出此错误

将证书添加到truststore vis keytool中

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