问答中心分类: JAVA错误-trustAnchors参数必须为非空
0
匿名用户 提问 8小时 前

我试图在Jenkins/Hudson上配置电子邮件,但我经常收到错误:

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

我在网上看到了大量关于这个错误的信息,但我没有得到任何有用的信息。我在Fedora Linux(不是OpenJDK)上使用Sun的JDK。
以下是我尝试过的一些事情。我试着听从这个建议post,但将cacerts从Windows复制到托管Jenkins的我的Fedora盒中并没有起作用。我试着跟踪本指南因为我正试图将Gmail配置为我的SMTP服务器,但它也不起作用。我还尝试手动下载和移动这些cacert文件,并使用本指南.
我愿意接受任何建议,因为我目前正陷于困境。我已经在Windows Hudson服务器上运行了它,但我在Linux上很挣扎。

29 Answers
0
Mikael Gueck 回答 8小时 前

在里面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),该错误已在Ubuntu仿生LTS 18.04.1和Ubuntu宇宙18.10中修复。

🗹Ubuntu 1770553:[SRU]backport ca certificates java from cosmic(20180413ubuntu1)
🗹Ubuntu 1769013:请合并Debian unstable(main)中的ca证书java 20180413(main)
🗹Ubuntu 1739631:JDK 9的新安装无法使用生成的PKCS12-cacerts密钥库文件
🗹docker library 145:9-jdk映像存在SSL问题
🗹Debian 894979:ca证书java:不适用于OpenJDK 9,应用程序失败,InvalidAlgorithmParameterException:trustAnchors参数必须为非空
🗹JDK-8044445:JEP 229:默认情况下创建PKCS12密钥库
🖺JEP 229:默认情况下创建PKCS12密钥库

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

$ which java
/usr/bin/java

您可以通过以下方式将Java备选方案设置为“自动”:

$ 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按照文章顶部解决方案脚本最后一行中描述的方式对其进行归档和重新生成。

vak 回复 8小时 前

Ubuntu 18用户,读这个!这将节省你很多时间的生命!非常感谢。

Yuri Gor 回复 8小时 前

这个答案帮助我修复了Ubuntu 18.04上maven的相同错误。我必须将/etc/ssl/certs/java/cacerts文件的所有者从root更改为我自己才能对其进行写入。然后我把它换回来了。

jsn 回复 8小时 前

我跑了sudo rm/etc/ssl/certs/java/cacerts然后sudo更新ca证书-f这解决了我在kubuntu 18.04的问题。

Thomas Theunen 回复 8小时 前

工作得很有魅力!在ubuntu 18.04上有此问题

Hrvoje T 回复 8小时 前

@jsn您的解决方案在Kubuntu 18.04上也对我有效。

Mikael Gueck 回复 8小时 前

@jsn,之所以这样解决了您的问题,是因为您还采取了一个额外的步骤,但您忽略了提及。我之所以不推荐这种解决方案,而不推荐简单的解决方案,是因为人们可能会注意到,作为一种副作用,其他东西已经坏了,需要他们花更多的时间来跟踪。

WhGandalf 回复 8小时 前

这实际上应该是一个新问题的一部分,因为这对于新的ubuntu 18用户来说太特殊了,非常感谢!

Bimde 回复 8小时 前

@jsn这个解决方案太棒了。为我开发了Ubuntu 18.04。谢谢:)

Bing Ren 回复 8小时 前

这个解决方案是金子!它不仅解决了Jenkins问题,还解决了maven build等其他问题!

Eduardo Casas 回复 8小时 前

你救了我的命!

bdurand 回复 8小时 前

Thx很多!!它解决了许多副作用。我在thx上点击了“此问题影响我”以供参考

Serafim 回复 8小时 前

由Ubuntu Mate 18.04上的@jsn保存

Sergii 回复 8小时 前

我不清楚怎么解释,但它在Ubuntu 18.04上对我有效。

Amen 回复 8小时 前

伙计!你是我的英雄!!

Vadim 回复 8小时 前

@jsn或许应该是单独的答案,并被评为顶级。为我工作18.04

Dalibor Filus 回复 8小时 前

@jsn感谢您的修复!对于未来的读者:这适用于openjdk-8-jdk,但不适用于openjdk-11-jdk。似乎是/etc/ca证书/更新。d/jks密钥库似乎不支持openjdk-11(这里没有列出)。

tiengtinh 回复 8小时 前

天啊!这个问题让我两天都发疯了。这真是天赐之物!非常感谢,先生!

Samrat 回复 8小时 前

@感谢这些解决方案,jsn也可以在基于ubuntu 18.04的linux mint 19上运行

ipkpjersi 回复 8小时 前

这是我在使用Java 11的Ubuntu 16.04上唯一有效的东西。

HRJ 回复 8小时 前

@jsn的解决方案也适用于Debian Stretch+openjdk8

St.Antario 回复 8小时 前

解决方案很有效。没有任何假设。只需复制和粘贴即可。非常感谢。

hanzo2001 回复 8小时 前

我将NiFi的Java版本从Oracle版本更改为更现代的OpenJDK,并且成功了

Asylzat 回复 8小时 前

第三个解决方案对我帮助很大,但如果你添加了如何再生cacerts,它会大得多。我找到了“sudo update ca certificates-f”和“sudo apt install ca certificates java-reinstall”在这里

Mikael Gueck 回复 8小时 前

很高兴听到这个消息,AsylzatAzaev。我澄清了你指出的句子。

Bundayy Olayinka 回复 8小时 前

我为此挣扎了好几天。sudo update-ca-certificates -fsudo apt install ca-certificates-java --reinstall在maven Ubuntu 18上为我修复了它

0
Michael Condouris 回答 8小时 前

这为我修复了Ubuntu上的问题:

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

(在此处找到:https://bugs.launchpad.net/ubuntu/+源/ca证书java/+bug/1396760)
ca-certificates-java不是Oracle JDK/JRE中的依赖项,因此必须显式安装。

Macil 回复 8小时 前

谢谢,当我在Ubuntu 15.04上遇到这个问题时,它为我解决了这个问题。

Defozo 回复 8小时 前

在Raspbian和Raspberry Pi上工作

Tuxdude 回复 8小时 前

在使用OpenJDK8的Debian jesse stable backports时遇到这个问题,这就解决了这个问题。在构建Docker图像时使用此选项。:)

Magick 回复 8小时 前

不幸的是我command not found当我在Ubuntu 16.04上尝试时。

Matt 回复 8小时 前

我完全不知道我刚才做了什么,但这为我在Ubuntu 16.04上解决了这个问题

John McFo 回复 8小时 前

防火墙后面的Debian Jessie(8.6)上的Atlassian Bitbucket服务器v4.9.1也存在同样的问题。这为我解决了问题。

EugeneRomero 回复 8小时 前

在Ubuntu 14.04上进行了Artifactory安装。在此命令之前,尝试添加远程存储库引发了trustAnchors错误。执行此命令后,一帆风顺:)

simianarmy 回复 8小时 前

已在Ubuntu 14.04上为我修复。非常感谢。

Pranav A. 回复 8小时 前

遗憾的是,Ubuntu MATE 18.04无法运行。我将尝试重新安装Java。

ivan.ukr 回复 8小时 前

在徐邦图18.04也不起作用。似乎在任何18.04中都不起作用。有什么建议吗?

Gagan 回复 8小时 前

伙计们,有什么好主意吗?在Ubuntu 18.04中该怎么做?

codefx 回复 8小时 前

sudo apt install ca-certificates-java. 然后sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

mzedeler 回复 8小时 前

@codefx-我已经按照你的建议做了,但它不起作用-在Ubuntu 18上。带有Java 10的x(默认)。

0
shvahabi 回答 8小时 前

在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
Mikael Gueck 回复 8小时 前

此描述事实上是不正确的,仅在重新安装Windows可能修复问题的相同意义上修复问题。无需删除所有Java包。如果要这样做,只需安装openjdk-8-jdk包装,移除/etc/ssl/certs/java/cacerts文件,然后运行sudo update-ca-certificates -f这是从pkcs12将cacerts文件格式化为jks格式化一个,如本线程其他地方所述。

Andrea Ligios 回复 8小时 前

@MikaelGueck虽然逻辑似乎站在你这边,但我在此向你保证,我之前确实做了你的评论和大多数其他投票答案以及18.04中所描述的事情这是唯一有效的答案. 我认为你的反对票应该变成反对票,或者至少消失,因为这是非常不应该的。

Mikael Gueck 回复 8小时 前

@AndreaLigios,你可以自己通读剧本,它们很短。他们有一组从8到10的硬编码JAVA\u主路径,他们一次尝试一个,他们调用Debian CA文件生成器,您也可以通读它,它使用现有的文件格式,因为您可以通读的JDK密钥文件处理程序代码具有兼容性回退模式。如果您的计算机以不同的方式运行此简单软件,您可能会遇到其他问题。您是否修改了java备选方案,并调用了其他JVM,因为删除可能会重置备选方案?

Andrea Ligios 回复 8小时 前

@MikaelGueck是的,在之前的一次尝试中,我修改了java备选方案,所以可能就是这样。我是第一个喜欢深入研究源代码并发现东西是如何工作的人,但今天这并不是我的目标,这只是我在实现真正目标的路上遇到的5-6个不同意外障碍之一。这个答案让我在不到2分钟的时间内解决了这个问题!我应该花多少时间研究脚本并找到更好的解决方案?为了什么,为了节省一些兆字节?这很激烈,但很有效(而且无论问题是什么),所以要对那些非常忙的人表示衷心的感谢

northern-bradley 回复 8小时 前

当实际执行2次清除并看到apt正在删除的软件包列表时,这对我来说似乎有点太重了,但是它为我不重要的kubuntu 18.04安装带来了麻烦,所以我很高兴节省了我使用的少量输入sudo apt-get purge openjdk* java-common default-jdk而不是--purge remove

PiKey 回复 8小时 前

在Ubuntu 18.04 LTS上工作。我还必须确保$JAVA\u HOME设置为/usr/lib/jvm/JAVA-1.8.0-openjdk-amd64

Inmer 回复 8小时 前

我已经寻找了两天的解决方案,您的回答解决了我的问题,谢谢。我刚搬到Kubuntu 18.04,这就成功了。

Ranjeet Singh 回复 8小时 前

下载jdk对我很有用。神谕com/technetwork/java/javase/downloads/…

0
Adam Plumb 回答 8小时 前

EJP基本上回答了这个问题(我意识到这有一个公认的答案),但我只是处理了这个边缘案例,我想让我的解决方案永垂不朽。
我有InvalidAlgorithmParameterException托管服务器上出错吉拉我之前为仅SSL访问设置的服务器。问题是我用PKCS#12格式设置了密钥库,但我的信任库是用JKS格式。
就我而言,我编辑了server.xml文件来指定PKCS的keystoreType,但我没有指定truststoreType,所以它默认为keystoreType。明确指定truststoreType,因为JKS为我解决了这个问题。

n611x007 回复 8小时 前

好吧,我帮你解决你的边缘案件,明白了。这就是它变得有趣的地方。

Kenco 回复 8小时 前

这正是我的问题。我使用的是Spring Boot 1.4.2。发布,并拥有硬件密钥库和软件信任库。我为密钥库指定了提供程序和类型,但没有指定信任库。因此,信任库使用了错误的提供程序和类型。指定这些(SUN和JKS)解决了问题。

tatsu 回复 8小时 前

你到底是怎么做到的?(此处为windows)

Lothar 回复 8小时 前

今天遇到我的Android grandle,我几乎理解你说的话,但你没有说如何解决它。不可帮助的答案

James Render 回复 8小时 前

在我的例子中,我有一个由jdk 14 keytool生成的信任库,默认为pkcs格式,试图连接到使用jks密钥库的kafka集群。我修改了创建truststore以使用switch的方式-storetype jks它解决了这个问题

0
Peter Kriens 回答 8小时 前

我在博客中遇到了此解决方案修复在OS X上运行OpenJDK 7时的信任锚问题:
修复在OS X上运行OpenJDK 7时的信任锚问题。如果您在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的人可以将此添加到他们的安装脚本中。

Andrew Swan 回复 8小时 前

我的“ln”命令(在OSX 10.6.8上)没有“h”选项;这意味着什么?

Andrew Swan 回复 8小时 前

啊,我有两个“ln”命令,一个in/usr/bin(默认)和一个in/bin;后者有一个“h”选项,并且有效。

A21z 回复 8小时 前

我用这个ln技术修复了从system 1.8安装链接到cacerts的损坏的1.6安装。谢谢

awksp 回复 8小时 前

对于未来的读者:您似乎还需要security文件夹(blacklisted.certs,local_policy.jarUS_export_policy.jar)让Java快乐。

BAE 回复 8小时 前

@Peter Kriens,为什么链接到cacerts在下面jre目录