错误 – trustAnchors参数必须是非空的

我正在尝试在Jenkins / Hudson上configuration我的电子邮件,并且不断收到错误消息

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

我在网上看到了大量有关错误的信息,但还没有得到任何工作。 我在Fedora Linux上使用Sun的JDK(不是openJDK)。

这是我尝试过的一些事情。 我试着按照从这篇文章的build议,但它复制从窗户cacerts到托pipejenkins我的Fedora框无法正常工作。 我尝试按照这个指南,因为我想configurationGmail作为我的SMTP服务器,但它也没有工作。 我还尝试手动下载并移动这些cacert文件,并使用本指南中的命令变体将它们移到我的java文件夹中。

我打开任何build议,因为我目前卡住了。 我已经从Windows Hudson服务器上得到它,但是我在Linux上苦苦挣扎。

这个奇怪的消息意味着您指定的信任库未find,或者由于访问权限而无法打开。

请参阅下面的 @ AdamPlumb的答案 。

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

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

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

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

我从http://architecturalatrocities.com/post/19073788679/fixing-the-trustanchors-problem-when-running-openjdk-7跑到这个解决scheme:;

修复在OS X上运行OpenJDK 7时的trustAnchors问题。如果您在OS X上运行OpenJDK 7,并且看到以下exception:

 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的人可以添加到他们的安装脚本。

EJP基本上回答了这个问题(我意识到这有一个可以接受的答案),但是我只是处理了这个边缘案例,想要永久解决我的问题。 我在之前为仅SSL访问设置的托pipejira服务器上发生了InvalidAlgorithmParameterException错误。 问题是我已经设置了PKCS#12格式的密钥库,但是我的信任库是JKS格式的。 在我的情况下,我编辑了我的server.xml文件来指定PKCS的keystoreType,但没有指定truststoreType,所以它默认为keystoreType。 明确指定truststoreType为JKS为我解决它。

在升级到Maverick后,我在OSX上遇到了这个问题,使用JDK 1.7。 这个修补程序对我来说只是简单地重新安装苹果版本的Java,可以在这里find: http : //support.apple.com/kb/DL1572

在Ubuntu> = 12.10中,证书保存在ca-certificates-java包中。 使用-Djavax.net.ssl.trustStore = / etc / ssl / certs / java / cacerts将会select它们,而不pipe你使用的是什么JDK。

 sudo update-ca-certificates -f 

然后创build证书文件

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

我又回来了,感谢他们,可惜它没有包含在安装中,而是到了那里。

升级到OSX Mavericks后,我遇到了很多安全问题

  • Amazon AWS的SSL问题
  • 同行未经Maven和Eclipsevalidation
  • trustAnchors参数必须是非空的

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

我期待这样的事情,因为我在Talend Open Studio中使用了一个替代的jvm。 (目前支持直到jdk1.7才存在),我为了安全目的而使用8 …无论如何

  • 更新您的证书商店

    sudo update-ca-certificates -f

然后

  • 在初始化参数中添加一个新的值

    sudo gedit $(特定于ini的体系结构的path,即TOS_DI … ini)

-Djavax.net.ssl.trustStore =的/ etc / SSL /证书/ JAVA / cacerts中

-Djavax.net.ssl.trustAnchors =的/ etc / SSL /证书/ JAVA / cacerts中

对我来说,第二项工作。 我认为,根据TOS / TEnt + jvm的版本,它具有不同的参数名称,但会查找相同的密钥库文件

对我来说,这是由于缺乏truststore中的trustedCertEntry

testing使用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将会成功启动。

在更新Mavericks之后,在使用旧的Java 6并试图访问https URL时,在OS X上也遇到了这个问题。 Fix是Peter Kriens的反面,我需要将1.7版的cacerts复制到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 

如果你在Ubuntu上遇到JDK9和Maven,你可以添加这个JVM选项 – 首先检查path是否存在:

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

如果文件丢失,请尝试安装ca-certificates-java作为某人注意到的:

 sudo apt install ca-certificates-java 

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

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

资料来源: java SSL和cert keystore

我使用(KeyStore Explorer)工具来创build新的JKS。 你可以从这个链接下载KeyStore Explorer

该错误表明系统在参数javax.net.ssl.trustStore提供的path中找不到信任库。

在Windows下,我将cacerts文件从jre / lib / security位置复制到eclipse安装目录(与eclipse.ini文件相同的位置),并在eclipse.ini中添加了以下设置:

 -Djavax.net.ssl.trustStore=cacerts -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=JKS 

对cacerts的path(%java_home%envvariables被某种方式覆盖)有一些麻烦,所以我用这个微不足道的解决scheme。

这个想法是为信任库文件提供一个有效的path – 理想的情况是使用相对path。 您也可以使用绝对path。

要确保商店types是JKS,您可以运行以下命令:

keytool -list -keystore cacerts

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

你必须在你的代码中添加上面两行。 它无法find信任库。

另一个原因是它实际上有效的错误。 一些邪恶的WIFI热点将与证书和男人在中间攻击你搞到谁知道什么(逃跑!)。

一些大的雇主也会这样做,特别是在敏感的networking区域,所以他们可以监控所有的encryptionstream量(从最终用户的angular度来看并不是很好,但可能有很好的理由)。

为了logging,这里没有答案为我工作。 我的gradle构build开始出现这个错误神秘的失败,无法从maven中心为特定的pom文件获取HEAD。

事实certificate,我有JAVA_HOME设置为我自己构build的OpenJDK,这是我为debuggingjavac问题而构build的。 将其设置回我的系统上安装的JDK修复它。

我在Linux上的Java 9.0.1上有这个错误消息。 这是由于已知的JDK错误,在.tar.gz二进制包(从http://jdk.java.net/9/下载)中,cacerts文件是空的。;

请参阅http://www.oracle.com/technetwork/java/javase/9​​-0-1-relnotes-3883752.html中的“已知问题”段落,声明“OpenJDK 9上的默认TLS不起作用”

在Debian / Ubuntu上(可能还有其他派生类),一个简单的解决方法是用“ca-certificates-java”包中的cacerts文件replace掉cacerts文件:

 sudo apt install ca-certificates-java cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts 

在RedHat / CentOS上,您可以从“ca-certificates”包中执行相同的操作:

 sudo yum install ca-certificates cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts 

我在互联网上find的解决scheme都没有工作,但一个修改彼得Kried的似乎做的工作。

首先运行/usr/libexec/java_homefind你的Java文件夹。 对我来说这是1.6.0.jdk版本。 然后去它的lib/security子文件夹(对于我/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security

然后删除cacerts文件(如果已经有),并用sudo find / -name "cacerts"在系统上search一个。 在我select的Xcode或其他应用程序的版本中,我find了多个,但是也在/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts

sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts" ,它应该可以正常工作(使用该文件并创build一个符号链接) 。

我有两个 – 从苹果公司的2017-001下载( https://support.apple.com/kb/dl1572 – 我假设这是正确的证书来自哪里)和甲骨文的一个安装在Mac OS X Sierra的Java。

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

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

这里的答案对Linux和Mac非常有用。

如果您使用的是Windows 10,则此问题可能是由Java更新引起的。 这似乎改变了JRE的目录path(即使你单独安装了JDK和JRE)。

对我来说,创build一个符号链接(在Windows中使用MinGW,Cygwin或您最喜欢的Bash shell)在c / Program Files / Java目录中,与之前的更新版本具有相同的名称,如下所示:

 ln -s jre1.8.0_101 jre1.8.0_92 

这样,您的旧安全设置可以find正确的path。 这当然是一个黑客,但它的作品。

发送电子邮件时发生同样的错误,但并非总是如此。 在我的情况下,我已经改变了一行代码来获取每一个新的会话对象:

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

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

从那时起,每次都在发送电子邮件。 这可能有助于某人。

错误我得到了:

javax.mail.MessagingException:无法将套接字转换为TLS;
嵌套exception是:javax.net.ssl.SSLException:java.lang.RuntimeException:意外的错误:java.security.InvalidAlgorithmParameterException:在com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport。)上,trustAnchors参数必须是非空的。 javax.mail.Service.connect(Service.java:317)上的com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666) :176)在javax.mail.Service.connect(Service.java:125)在javax.mail.Transport.send0(Transport.java:194)在javax.mail.Transport.send(Transport.java:124)

在Ubuntu上:

sudo apt安装ca-certificates-java

要么

sudo apt-get install ca-certificates-java

为我sorting。

在使用以PKCS12格式使用IBM Websphere JDK keytool导出的信任库并尝试使用Oracle JRE上的该文件进行ssl通信时,出现此错误。 我的解决scheme是在IBM jre上运行,或使用IBM Websphere keytool将信任库转换为JKS,以便能够在Oracle jre中运行它。

在我的情况下,我正在configuration一个双向安全服务器,我没有把公钥证书或权威证书放在密钥库中来识别客户端部分。

我只包括服务器专用证书,所以我的解决scheme是添加公共证书或权威证书。

升级到Spring Boot 1.4.1 (或更新版本)后,您可能还会遇到此错误,因为它将Tomcat 8.5.5作为其依赖项的一部分。 问题是由于Tomcat处理信任存储的方式,如果您恰好在Spring Bootconfiguration中指定了您的信任存储位置与您的密钥存储相同,则可能会得到trustAnchors parameter must be non-empty消息当启动应用程序。

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

只需要删除server.ssl.trust-storeconfiguration,除非你知道你需要它,在这种情况下请查阅下面的链接。

以下问题包含有关该问题的更多详细信息:

我在运行一个特定的android套件来testingubuntu 14.04时遇到了这个问题。 沙欣build议两件事情对我有用

sudo update-ca-certificates -f

sudo /var/lib/dpkg/info/ca-certificates-java.postinstconfiguration

对我来说,只需将jenkins插件“Email Extension Plugin”升级到最新版本(2.61)就可以解决问题。 这两个插件负责电子邮件configurationjenkins电子邮件扩展插件电子邮件扩展模板插件