错误 - trustAnchors参数必须为非空

Dav*_*ill 456 java hudson jakarta-mail jenkins

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

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty
Run Code Online (Sandbox Code Playgroud)

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

以下是我尝试过的一些事情.我尝试按照这篇文章的建议,但将cacerts从Windows复制到我托管Jenkins的Fedora盒子都没有用.我尝试将Gmail配置为我的SMTP服务器时尝试按照本指南操作,但它也无法正常工作.我还尝试手动下载并移动这些cacert文件,并使用本指南中的命令变体将它们移动到我的Java文件夹.

我对任何建议持开放态度,因为我现在正被困住.我已经从Windows Hudson服务器上工作了,但我在Linux上苦苦挣扎.

use*_*421 483

这个奇怪的消息意味着您指定的信任库是:

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

另见@ AdamPlumb的答案如下.

  • 顺便说一句,这会发生在例如从 OracleJDK8 切换到 OpenJDK8 时,因为 OpenJDK 带有一个空的信任存储。从 OpenJDK11 复制一个修复了问题 (8认同)
  • @BubblewareTechnology不,错误在文件名中,而不是在如何将证书导入文件中.你的博客不正确.您也不应该建议修改JRE $/cacerts文件.它将改变下一次Java升级.您需要一个复制它的进程,将您自己的证书添加到副本,并将该副本用作信任库.重复每次Java升级.而且你根本不需要告诉Java它自己的信任库,只关注你自己的信任库,如果它不同的话. (4认同)
  • 答案是关于我如何导入它.我好像错过了关键的一步.请参阅[Java Error InvalidAlgorithmParameterException] [1] [1]:http://jyotirbhandari.blogspot.com/2011/09/java-error-invalidalgorithmparameterexc.html (2认同)
  • 确认这个答案是对的.我在Tomcat下得到了错误.我在`$ {CATALINA_HOME}\conf`中有我的信任库,但是`CATALINA_HOME`没有被设置,因此Tomcat在`\ conf`下查找信任库. (2认同)
  • 我将添加一个扭曲:即使信任库存在,可访问,格式正确,如果它完全是EMPTY,那么你可以通过各种库(包括Apache HttpClient)获得错误. (2认同)

Mik*_*eck 257

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
Run Code Online (Sandbox Code Playgroud)

https://git.mikael.io/mikaelhg/broken-docker-jdk9-cacerts


状态(2018-08-07),该错误已在Ubuntu Bionic LTS 18.04.1和Ubuntu Cosmic 18.10中修复.


Ubuntu 1770553:[SRU] backport ca-certificates-java from cosmic(20180413ubuntu1)

Ubuntu 1769013:请合并来自Debian unstable(main)的ca-certificates-java 20180413(main)

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

docker-library 145:9-jdk image有SSL问题

Debian 894979:ca-certificates-java:不能与OpenJDK 9一起使用,应用程序因InvalidAlgorithmParameterException而失败:trustAnchors参数必须为非空

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

JEP 229:默认创建PKCS12密钥库


如果在此变通办法之后问题仍然存在,您可能希望确保实际运行刚刚修复的Java发行版.

$ which java
/usr/bin/java
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令将Java替代项设置为"auto":

$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so
Run Code Online (Sandbox Code Playgroud)

您可以仔细检查您正在执行的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)
Run Code Online (Sandbox Code Playgroud)

有替代的解决方法为好,但那些有自己的副作用,这将需要额外的未来的维护,因为没有任何回报.

下一个最佳解决方法是添加行

javax.net.ssl.trustStorePassword=changeit
Run Code Online (Sandbox Code Playgroud)

到文件

/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties
Run Code Online (Sandbox Code Playgroud)

无论哪个存在.

第三个问题最少的解决方法是更改​​值

keystore.type=pkcs12
Run Code Online (Sandbox Code Playgroud)

keystore.type=jks
Run Code Online (Sandbox Code Playgroud)

在文件中

/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security
Run Code Online (Sandbox Code Playgroud)

无论哪个存在,然后删除该cacerts文件并以前面描​​述的方式重新生成它.

  • 我运行了**sudo rm/etc/ssl/certs/java/cacerts**然后**sudo update-ca-certificates -f**这解决了我在kubuntu 18.04中的问题. (77认同)
  • Ubuntu 18位用户,请阅读此内容!这将节省你的生命中的许多小时!谢谢! (48认同)
  • @jsn谢谢.在ubuntu 18.04为我工作 (7认同)
  • 这个答案帮助我在Ubuntu 18.04上修复了与maven相同的错误.我不得不将/ etc/ssl/certs/java/cacerts文件的所有者从root更改为我自己才能写入.然后我把它换回来了. (5认同)
  • 非常感谢!在ubuntu 18.04为我工作 (3认同)
  • @jsn,感谢您的解决方案,它也可以在基于Ubuntu 18.04的Linux Mint 19上运行 (2认同)
  • @jsn的解决方案也适用于Debian Stretch + openjdk8 (2认同)

小智 103

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

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
Run Code Online (Sandbox Code Playgroud)

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

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

  • 遗憾的是,在Ubuntu MATE 18.04上不起作用.我将尝试重新安装Java. (9认同)
  • 谢谢,当我在Ubuntu 15.04上遇到它时,这解决了我的问题. (2认同)

shv*_*abi 67

在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
Run Code Online (Sandbox Code Playgroud)

检查您是否已成功删除所有相关包:

sudo update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)

系统将提示您没有可用于配置的Java,否则此解决方法将失败.

然后重新安装所需的包:

sudo apt-get install openjdk-8-jdk
Run Code Online (Sandbox Code Playgroud)

  • 为我工作.谢谢 (7认同)
  • 只有登录才能竖起大拇指.谢谢先生,它有效. (4认同)

Ada*_*umb 55

EJP基本上回答了这个问题(我意识到这有一个已经接受的答案),但我刚刚处理了这个边缘案例并想要永久化我的解决方案.

我在托管的Jira服务器上遇到了InvalidAlgorithmParameterException错误,我之前已将其设置为仅限SSL访问.问题是我以PKCS#12格式设置了我的密钥库,但我的信任库是JKS格式.

在我的例子中,我编辑了我的server.xml文件以将keystoreType指定为PKCS,但我没有指定truststoreType,因此它默认为keystoreType.明确地将truststoreType指定为JKS为我解决了它.

  • 你是怎么做到的?(这里的窗户) (10认同)
  • 这正是我的问题。我使用的是Spring Boot 1.4.2.RELEASE,并且具有硬件密钥库和软件信任库。我指定了密钥库的提供程序和类型,但未指定信任库。结果,信任库使用了错误的提供程序和类型。指定那些(SUN和JKS)可以解决此问题。 (2认同)
  • 今天和我的Android grandle碰到这个问题,我几乎理解您说的话,但是您没有说如何解决。无助的答案 (2认同)

Pet*_*ens 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
Run Code Online (Sandbox Code Playgroud)

有一个简单的解决方案.只需链接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
Run Code Online (Sandbox Code Playgroud)

您需要为已安装的每个OpenJDK版本执行此操作.只需更改-v 1.7为您要修复的版本即可.运行/usr/libexec/java_home -V以查看已安装的所有JRE和JDK.

也许OpenJDK的人可以将它添加到他们的安装脚本中.


小智 42

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

  • 我发现我需要手动运行`update-ca-certificates -f`来填充cacerts文件 (53认同)
  • @Portablejim 谢谢。您的评论解决了我在 Ubuntu 15.04beta 上构建 Apache Spark 时遇到的第一个问题。 (4认同)

Kiw*_*tin 34

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


小智 28

我跑了

sudo update-ca-certificates -f
Run Code Online (Sandbox Code Playgroud)

创建证书文件,然后:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
Run Code Online (Sandbox Code Playgroud)

我回来了,谢谢你们.遗憾的是它没有包含在安装中,但最终我到了那里.

  • 不幸的是,在Ubuntu 18.04中不起作用 (13认同)
  • `sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure`没有明星** (2认同)

raz*_*one 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
Run Code Online (Sandbox Code Playgroud)

我在cacerts的路径上遇到了一些麻烦(%java_home%环境变量以某种方式被覆盖),所以我使用了这个简单的解决方案.

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

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

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一真正奏效的答案.谢谢@razvanone (2认同)
  • 我设法遇到了一个小“问题”:eclipse.ini 文件中的三行必须位于实际的三个单独的行上。我最初将它们全部放在一行上,而 Eclipse 没有接收到这一点。 (2认同)

eri*_*111 13

删除ca-certificates-java包并再次安装它对我有用(Ubuntu MATE 17.10(Artful Aardvark)).

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

sudo apt-get install ca-certificates-java
Run Code Online (Sandbox Code Playgroud)

谢谢你,jdstrand:错误983302的评论1,Re:ca-certificates-java无法在Oneiric Ocelot上安装Java cacerts.


Fre*_*her 11

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

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

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

  • 啊.Java 6在公众支持结束多年之后,肯定充满了安全漏洞.Apple可以下载,因此无法使用Java 7/8运行的旧软件可以继续执行,但它不应该用于与公共互联网上的服务建立SSL连接,例如1. AWS,2.Maven中央,3.其他任何事情. (5认同)

rai*_*tin 11

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


小智 9

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

然后

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

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

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

  • 你是从哪里获得属性`javax.net.ssl.trustAnchors`的?JSSE文档中没有提到它. (4认同)

mut*_*nUp 9

对我来说,这是由信任库中缺少trustedCertEntry引起的.

要测试,请使用:

keytool -list -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)

它给了我:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry
Run Code Online (Sandbox Code Playgroud)

即使我的PrivateKeyEntry包含CA,它也需要单独导入:

keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)

它导入证书,然后重新运行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>
Run Code Online (Sandbox Code Playgroud)

现在它有一个trustedCertEntry,Tomcat将成功启动.


Mos*_*roy 6

我在 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
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)


JRi*_*dsz 6

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

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

cacerts 文件为空

就我而言,查看我的 jdk 文件夹,与其他 jdk 文件夹(服务器和朋友)相比,cacerts 文件的大小较小:

/../some_openjdk/jre/lib/security/cacerts 大小:32 字节

我从以下位置下载的:

使固定

经过多次尝试,我找到了正确的 jdk.tar.gz,其中包含大小为101 KB的cacerts文件

我从https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries下载了open jdk

我在这个 Dockerfile 中找到了这个网址:


Sal*_*man 5

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

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);
Run Code Online (Sandbox Code Playgroud)

来源:Java SSL 和证书密钥库

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


Rob*_*unt 5

升级到 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
Run Code Online (Sandbox Code Playgroud)

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

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


dma*_*tej 5

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

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts
Run Code Online (Sandbox Code Playgroud)

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

sudo apt install ca-certificates-java
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

527421 次

最近记录:

6 年 前