错误-trustAnchors参数必须为非空


492

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

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

我已经在网上看到了大量有关该错误的信息,但是我没有得到任何帮助。我在Fedora Linux(不是OpenJDK)上使用Sun的JDK。

这是我尝试过的几件事。我试着从以下这个建议,但复制从Windows的cacerts到托管詹金斯没有工作,我的Fedora箱。在尝试将Gmail配置为SMTP服务器时,我尝试按照本指南进行操作,但是该方法也不起作用。我还尝试手动下载并移动这些cacert文件,并使用本指南中的各种命令将其移动到我的Java文件夹中

我愿意接受任何建议,因为我目前仍处于停滞状态。我已经从Windows Hudson服务器上运行了它,但是我在Linux上苦苦挣扎。

Answers:


512

此奇怪消息表示您指定的信任库为:

  • 空的
  • 找不到,或者
  • 无法打开(例如由于访问权限)。

另请参见下面的 @AdamPlumb的答案

要调试此问题(在此处已写过)并了解正在使用的信任库,可以添加属性 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

1
谢谢EJP,我在这里看到了您的帖子但不确定如何验证信任库是否存在。另外,我调出了server.xml文件,但不确定如何验证信任库。我是否只检查keystoreFile =“ conf / .keystore”首选项(该文件中不存在keystoreFile)?
David Gill

2
答案是我如何导入它。我似乎错过了关键的一步。参见[Java错误InvalidAlgorithmParameterException] [1] [1]:jyotirbhandari.blogspot.com/2011/09/…–
David Gill

2
确认此答案正确。我在Tomcat下遇到错误。我有我的信任库,${CATALINA_HOME}\conf但是CATALINA_HOME没有设置,因此Tomcat正在寻找\conf该信任库。
SingleShot 2012年

4
@BubblewareTechnology不,错误出在文件名中,而不是您如何将证书导入文件中。您的博客不正确。您也不应该建议修改JRE $ / cacerts文件。下一次Java升级将更改。您需要一个过程来复制它,将自己的证书添加到副本,然后将副本用作信任库。重复每次Java升级。而且,您根本不需要告诉Java它自己的信任库,只要与您自己的信任库不同即可。
洛恩侯爵,

3
我要加个折衷:即使信任库存在,可访问且格式正确,如果它是完全空的,那也是使用各种库(包括Apache HttpClient)会遇到的错误。
艾伦·弗兰佐尼

265

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 Bionic LTS 18.04.1和Ubuntu Cosmic 18.10中修复。


🗹Ubuntu 1770553:[SRU]从cosmic向后移植ca-certificates-java(20180413ubuntu1)

🗹Ubuntu 1769013:请合并来自Debian不稳定(主要)的ca-certificates-java 20180413(主要)

🗹Ubuntu 1739631:使用JDK 9进行的全新安装无法使用生成的PKCS12 cacerts密钥库文件

🗹docker -library 145:9-jdk映像具有SSL问题

🗹Debian 894979:ca-certificates-java:不适用于OpenJDK 9,应用程序失败,出现InvalidAlgorithmParameterException:trustAnchors参数必须为非空

🗹JDK -8044445:JEP 229:默认情况下创建PKCS12密钥库

EP 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文件,然后删除该文件,并按照帖子顶部变通方法脚本最后一行中所述的方式重新生成该文件。


50
Ubuntu 18用户,请阅读!这将节省您的许多时间!谢谢!
vak

5
这个答案帮助我修复了Ubuntu 18.04上的Maven相同的错误。我必须将/ etc / ssl / certs / java / cacerts文件的所有者从根目录更改为我自己,以便能够对其进行写入。然后我将其切换回去。
尤里·戈尔

77
我先运行sudo rm / etc / ssl / certs / java / cacerts,然后运行sudo update-ca-certificates -f,这在kubuntu 18.04中解决了我的问题。
jsn

2
感谢解决方案,@ jsn也可以在基于Ubuntu 18.04的Linux Mint 19上运行
Samrat 18'Jul

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

105

这为我在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中不是依赖项,因此必须明确安装。


2
谢谢,这为我在Ubuntu 15.04上遇到该问题解决了问题。
Macil 2015年

在Raspberry Pi上的Raspbian上工作
Defozo's

1
通过Debian jesse与OpenJDK8的稳定反向移植解决了该问题,并解决了该问题。在构建Docker映像时正在使用此功能。:)
Tuxdude

9
不幸的是,它不适用于Ubuntu MATE 18.04。我将尝试重新安装Java。
Pranav A.18年

1
@codefx-我已完成您的建议,但不起作用-在具有Java 10(默认)的Ubuntu 18.x上。
mzedeler

69

在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

此说明实际上是不正确的,并且只能以与重新安装Windows可以解决问题相同的方式解决该问题。无需删除所有Java软件包。如果要采用这种方式,则只需安装openjdk-8-jdk软件包,删除/etc/ssl/certs/java/cacerts文件并运行sudo update-ca-certificates -f,这是从pkcs12格式化的cacerts文件切换到格式化的文件的一种round回方式jks,如本线程中其他地方所述。
Mikael Gueck

1
@MikaelGueck虽然逻辑似乎在您一边,但我在这里向您保证,我以前确实按照您的评论和大多数其他带表决的答案中的描述进行了操作,而在18.04中,这是唯一有效的答案。我认为您的下票应该变成上票,或者至少消失,因为它是当之无愧的。
安德里亚·利吉奥斯

@AndreaLigios,您可以自己阅读这些脚本,它们非常简短。他们有一组从8到10的JAVA_HOME路径的硬编码,它们一次尝试使用它们,它们调用Debian CA文件生成器,您也可以使用现有的文件格式通读该文件,因为JDK密钥文件处理程序代码您可以通读,具有兼容性回退模式。如果您的计算机以不同方式运行此简单软件,则可能会有其他问题。您是否修改了Java替代方案并调用了其他JVM,因为随后删除可能会重置替代方案?
Mikael Gueck

1
@MikaelGueck是的,在以前的尝试之一中,我已经修改了Java替代方案,所以可能就是这样。我是第一个喜欢研究源代码并发现东西是如何工作的人,但是今天这不是我的目标,这只是我实现目标的5-6个不同的意外障碍中的一个。这个答案使我可以在不到2分钟的时间内解决问题!我应该花多少时间研究脚本并找到更好的解决方案?而为了节省一些兆字节呢?这太剧烈了,但是有效(无论问题出在哪里),因此非常感谢OP忙于地狱的人
Andrea Ligios

1
我一直在寻找解决方案2天,谢谢您的回答,解决了我的问题。我只是移到Kubuntu 18.04,就可以了。
guepardomar

55

EJP基本上回答了这个问题(并且我意识到这是一个可以接受的答案),但是我只是处理了这种极端情况而已,并希望将我的解决方案永生化。

InvalidAlgorithmParameterException在托管的Jira上出错先前设置为仅SSL访问服务器。问题是我已经以PKCS#12格式设置了密钥库,但是我的信任库却是JKS格式。

就我而言,我已经编辑了server.xml文件以将keystoreType指定为PKCS,但是没有指定truststoreType,因此它默认为任何keystoreType。以JKS显式指定truststoreType为我解决了它。


好吧,我可以帮助您永不过时的解决方案。那就是它变得有趣的地方。
n611x007

2
这正是我的问题。我使用的是Spring Boot 1.4.2.RELEASE,并且具有硬件密钥库和软件信任库。我指定了密钥库的提供程序和类型,但未指定信任库。结果,信任库使用了错误的提供程序和类型。指定那些(SUN和JKS)可以解决此问题。
Kenco

12
您到底是怎么做到的?(此处为Windows)
tatsu

2
今天和我的Android grandle碰到这个问题,我几乎理解您说的话,但是您没有说如何解决。无法解决的问题
Lothar

52

我在博客文章《解决在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

有一个简单的解决方法。只需链接到Apple 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家伙可以将其添加到他们的安装脚本中。


1
我的“ ln”命令(在OSX 10.6.8上)没有“ h”选项;这意味着做什么?
安德鲁·斯旺2012年

1
啊,我有两个“ ln”命令,一个在/ usr / bin中(默认),另一个在/ bin中;后者有一个“ h”选项并起作用。
安德鲁·斯旺

我使用这种ln技术修复了从系统1.8安装到cacerts的断开的1.6安装问题。谢谢!
A21z 2015年

1
对于未来的读者:看来,你还需要其他3个文件,这些文件中security的文件夹(blacklisted.certslocal_policy.jar,和US_export_policy.jar对Java)快乐。
awksp

@Peter Kriens,为什么链接到目录cacertsjre
BAE

45

Ubuntu 12.10(Quantal Quetzal)或更高版本中,证书保存在ca-certificates-java软件包中。-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts无论您使用的是哪种JDK,使用都会拾取它们。


54
我发现我需要update-ca-certificates -f手动运行才能填充cacerts文件
Portablejim

4
@Portablejim谢谢。您的评论解决了我在Ubuntu 15.04beta上构建Apache Spark时遇到的第一个问题。
保罗

1
感谢@Portablejim,您的评论对我在Ubuntu 15.04上有用。
David Berg,2015年

谢谢。这已解决我的PhpStrom +修补JDK问题。我将此密钥写到了“ phpstorm64.vmoptions”文件中。
维吉特

在ubuntu 18.04中对我不起作用,JDK是1.8.0_62
Devendra Singraul

34

在升级到OS X v10.9(Mavericks)之后,我在使用JDK 1.7的OS X上遇到了这个确切的问题。对我有用的修补程序是简单地重新安装Apple版本的Java,可从http://support.apple.com/kb/DL1572获得


我在OSX上的Grails使用的Java 6中遇到了这个问题。我还安装了来自Oracle的Java 7,还升级到了Mavericks。从Apple网站重新安装Java 6也为我解决了该问题。
pm_labs 2014年

将开放的jdk 6安装到ubuntu云盒时,请执行此操作。很高兴看到一张熟悉的面孔,顺便说一句
Ben Hutchison

30

我跑了

sudo update-ca-certificates -f

创建一个证书文件,然后:

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

谢谢大家,我重新营业了。遗憾的是它没有包含在安装程序中,但最终还是到了。


当我跑步时,sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**我会得到sudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
Magick

只是 sudo update-ca-certificates -f安装了Debian jessie上openjdk-8-jre-headless的jessie-backports,足够ca-certificates-java了。我认为安装顺序很重要(之后的JRE ca-certificates-java可能会导致这种情况,因为后者没有向后移植Java 8的任何触发器)。
mirabilos'2

2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure 没有星星**
于家澳

update-ca-certificates -f是固定它的东西。我不需要第二条命令
Mark Jeronimus

17

该错误表明系统无法在参数提供的路径中找到信任库 javax.net.ssl.trustStore

在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的路径时遇到了一些麻烦(%java_home%环境变量被覆盖),因此我使用了这种简单的解决方案。

这个想法是提供一个到信任库文件的有效路径-理想情况下,它将使用相对路径。您也可以使用绝对路径。

要确保商店类型为JKS,您将运行以下命令:

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN

2
这是唯一有效的答案。谢谢@razvanone
Akshar Patel

1
我设法打了一个小“陷阱”:eclipse.ini文件中的三行必须在实际的三行中。我最初将所有这些都放在一行上,而日食并没有引起人们的注意。
斯金

16

删除ca-certificates-java软件包并再次安装对我来说很有效(Ubuntu MATE 17.10(Artful Aardvark))。

sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java

谢谢jdstrand:错误983302的注释1,回复:ca-certificates-java无法在Oneiric Ocelot上安装Java cacerts


11

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

  • Amazon AWS的SSL问题
  • 对等方未通过Maven和Eclipse进行身份验证
  • trustAnchors 参数必须为非空

我应用了此Java更新,并修复了所有问题:http : //support.apple.com/kb/DL1572?viewlocale=zh_CN


5
啊。Java 6距离其公共支持的终结已经过去了很多年,并且肯定充满了安全漏洞。Apple可以下载它,以便无法与Java 7/8一起运行的旧软件可以继续执行,但不应用于建立与公共Internet上服务的SSL连接,例如1. AWS,2。Maven中央,3.其他。
扎克·汤普森

10

我期望这样的事情,因为我在Talend Open Studio中使用了备用JVM (目前仅在JDK 1.7之前才存在支持)。我出于安全目的使用8 ...无论如何

  • 更新您的证书存储:

    sudo update-ca-certificates -f

然后

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

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

对我来说,第二个条目有效。我认为,根据Talend Open Studio / TEnt + JVM的版本,它具有不同的参数名称,但它查找相同的密钥库文件。


4
javax.net.ssl.trustAnchors从哪里获得财产?JSSE文档中未提及它。
洛恩侯爵,

10

对我而言,这是由信任库中缺少trustCertEntry引起的。

要测试,请使用:

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


NB检查baeldung教程,并提供有用的Makefile作为创建密钥库和信任库的快捷方式(spring-security-x509项目)baeldung.com/x-509-authentication-in-spring-security
hello_earth '19

9

一些OpenJDK供应商发行版通过cacerts与二进制文件一起分发空文件而导致此问题。该错误的解释如下:https : //github.com/AdoptOpenJDK/openjdk-build/issues/555

您可以adoptOpenJdk8\jre\lib\security\cacerts从旧版本复制到文件,例如c:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts

AdoptOpenJDK错误版本为https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip


我认为我也是这种情况。在AdoptOpenJDK 202中存在此错误,在222中有效。因此,如果可能,请更新您的jdk。
马蒂

6

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

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

如果该文件丢失,请尝试按照以下提示安装ca-certificates-java:

sudo apt install ca-certificates-java

如果您使用docker,则也可以尝试使用“ maven:3-jdk-9-slim”图像代替“ maven:3-jdk-9”
康斯坦丁·帕夫洛夫

谢谢,这为我工作了OpenJDK-8 JDK在Ubuntu 18.04
阿夫塔卜函数naveed

4

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

请参阅JDK 9.0.1发行说明的“已知问题”段落,说“ TLS在OpenJDK 9上默认不起作用”。

在Debian / Ubuntu(以及其他衍生产品)上,一种简单的解决方法是将cacerts文件替换为“ ca-certificates-java”软件包中的文件:

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

4

Ubuntu 16.04 LTS(Xenial Xerus)升级到Ubuntu 18.04 LTS(Bionic Beaver)后,尝试使用Maven 3 时遇到了这个问题。

检查/ usr / lib / jvm / java-8-oracle / jre / lib / security时,我的cacerts文件是指向以下文件的符号链接: /etc/ssl/certs/java/cacerts

我还有一个可疑文件cacerts.original

我将其重命名cacerts.originalcacerts,从而解决了该问题。


cacerts.original文件jks采用该格式,并由Ubuntu 16.04的Java 8生成,该Java 8使用该格式作为默认格式。该cacerts文件pkcs12采用由Ubuntu 18.04的Java 10生成的格式,该格式使用该格式作为默认格式。如本线程其他地方所述,新格式要求您将密码传递给可执行文件。但是,只要您生成一个新的空jks cacerts文件或复制一个旧的空文件,下一个cacerts生成过程就会清空现有文件,并用文件系统中的CA证书重新填充它。
Mikael Gueck

3

当使用旧的Java 6并尝试访问HTTPS URL时,在更新OS X v10.9(Mavericks)之后,我也在OS X上遇到了此问题。解决的方法是彼得·克林斯(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

1
此处的命令尝试将目录复制到文件。毫无意义。
praseodym

我同意使用反向解决方案的评估。我发现jdk1.6的软链接断开了/Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/lib/security/cacerts-> /System/Library/Java/Support/CoreDeploy.bundle /目录/主页/ lib / security / cacerts。因此,我修复了断开的软链接,然后从jdk1.7安装的cacerts中进行了复制。
James A Wilson

注意:完成后,您应该可以复制为验证权限而复制的cacerts文件。
灰色

另外,修复了cp的正确方向,并为mkdir和cp添加了umask。
灰色,

3

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

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

来源:Java SSL和证书密钥库

我使用(KeyStore Explorer)工具创建新的JKS。您可以从此链接KeyStore Explorer下载。


keystore-explorer为我完成了工作。您只需要创建默认密钥库,然后检查并保存站点/主机的证书文件即可。
Shantha Kumara

3

升级到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配置,除非您知道自己需要它,在这种情况下,请查阅下面的链接。

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


3

我在Android SDK sdkmanager中遇到了此问题。对我而言,此解决方案有效:

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

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


2

根据记录,这里没有答案对我有用。我的摇篮构建开始这个错误神秘失败,无法从获取HEAD 的Maven 中央特定POM文件。

事实证明,我已将JAVA_HOME设置为自己的OpenJDK构建,该构建是为调试javac问题而构建的。将其设置回安装在我的系统上的JDK可以修复它。


...导致找不到信任库,如其他答案所示。
罗恩侯爵

1
是的,但是如果您无法弄清为什么找不到信任库,那么知道无法找到信任库是完全没有帮助的。它有很多可能出错的方法,当它们都不是您自己的系统失败的特定方式时,这令人沮丧。
user3562927

它们都“发生”相同的错误:指定的信任库无法打开或为空。有上百万种方法可能会出现这种情况,并且SO上没有足够的空间来枚举它们。
罗恩侯爵

1

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


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

您必须在代码中添加以上两行。无法找到信任库。


2
如果您不这样做,它将使用JRE信任库,并且一定可以找到它。该错误是由这些参数中的错误值引起的,而不是它们不存在。您的代码中命名的文件仅适用于您的安装,不适用于一般情况。
洛恩侯爵

设置这些属性的正确方法是在命令行上传递它们;java -Djavax.net.ssl.trustStore=/tmp/cacerts ...或者,如果要为使用JDK运行的所有程序全局设置它们,请将行添加到JDK的management.properties文件中。
Mikael Gueck

1

我在运行特定的Android套件以在Ubuntu 14.04(Trusty Tahr)上进行测试时遇到了这个问题。shaheen提出的两点对我有用:

sudo update-ca-certificates -f

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

1

我在Internet上找不到的解决方案都行不通,但是彼得·克林斯Peter Kriens)的答案的修改版本似乎可以解决问题

首先通过运行查找Java文件夹/usr/libexec/java_home。对我来说是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"它应该可以工作。

我同时拥有-从Apple的2017-001下载中获得的Java(https://support.apple.com/kb/dl1572-我认为这是正确证书的来源)和在Mac OS X v10.12(Sierra)上安装的Oracle证书。


1

在ubuntu 14.04上使用来自ppa:openjdk-r / ppa的openjdk 11,这对我有用:

在java.security中,将密钥库类型更改为

keystore.type=jks

然后:

sudo dpkg --purge --force-depends ca-certificates-java
sudo apt-get install ca-certificates-java

当您检查它是否有效时,请确保您没有使用任何仍在运行旧Java的守护程序(例如--no-daemongradle选项)

此错误很好地描述了所有内容,将帮助您了解https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631的情况


1

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

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

sudo ln -s /etc/ssl/certs/java/cacerts /path/to/downloaded/java/jre/lib/security/cacerts


1

极有可能这将帮助任何人,但是....对于在Raspberry Pi上通过Docker映像运行Java 8(使用AMD CPU)的任何人,我都会获得以下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"]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.