java.security.InvalidAlgorithmParameterException:在Linux上,trustAnchors参数必须为非空,或者为什么默认的信任库为空

Boz*_*zho 74 java security

当你谷歌这个例外:java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty,会出现多个结果.然而,没有确定的解决方案,只有猜测.

当我尝试使用SSL打开连接时,问题出现了(至少在我的情况下).它在我的Windows机器上工作正常,但是当我将它部署到linux机器(安装了sun的jre)时,它会因上述异常而失败.

问题是JRE的默认信任库由于某种原因是空的(大小只有32字节,而在Windows上是80kb).

当我将我的jre/lib/security/cacerts文件从Windows 复制到linux时,它运行正常.

问题是 - 为什么linux jre有一个空的信任存储?

请注意,这种情况发生在使用AMI linux的Amazon EC2实例上,因此可能是由于一些亚马逊政策(我认为java已预先安装,但我不确定)

use*_*346 101

我在Ubuntu中遇到了这个错误.我看到/ usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts是/ etc/ssl/certs/java/cacerts的断开链接.这导致我 犯了这个错误: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/983302 ca-certificates-java的README最终显示了实际修复:

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

apt-get install ca-certificates-java对我不起作用.它只是将其标记为手动安装.

  • 这应该是最受接受的答案 (2认同)

bes*_*sss 26

标准的Sun JDK for linux具有绝对正确的cacerts和指定目录中的所有文件.问题是您使用的安装.

  • 我目前在这里遇到同样的问题.我使用了openjdk 7,它默认创建了一个符号链接到`/ etc/ssl/certs/java/cacerts`,在Amazon EC2上的ubuntu AMI上是空的.目前正在尝试使用sun jdk. (3认同)

小智 13

我通过在密钥库中放置一个虚拟证书来避免此错误(OSX 10.5.8上的Java 1.6.0),例如

keytool -genkey -alias foo -keystore cacerts -dname cn=test -storepass changeit -keypass changeit
Run Code Online (Sandbox Code Playgroud)

当然问题应该是"为什么java不能处理空的trustStore?"


Man*_*eau 9

不是原始问题的答案,但在尝试解决类似问题时,我发现Mac OS X对Maverics的更新搞砸了java安装(实际上是cacert).sudo rm -rf /Library/Java/JavaVirtualMachines/*.jdkhttp://www.oracle.com/technetwork/java/javase/downloads/index.html中删除并重新安装


The*_*ter 8

我可以通过将系统属性trustStore设置为缺少的jks文件来生成此错误.例如

    System.setProperty("javax.net.ssl.keyStore", "C:/keystoreFile.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
    System.setProperty("javax.net.ssl.trustStore", "C:/missing-keystore.jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "mypassword");
Run Code Online (Sandbox Code Playgroud)

此代码由于某种原因不会生成FileNotFound异常,但完全是上面列出的InvalidAlgorithmParameter异常.

有点愚蠢的答案,但我可以重现.


Dan*_*ore 7

在安装了java-8-oracle的Ubuntu 14.10上遇到了同样的问题.

解决了安装ca-certificates-java包的问题:

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


小智 6

我在Windows上的解决方案是以管理员身份运行控制台窗口或更改环境变量MAVEN_OPTS以使用trust.jks的硬编码路径(例如'C:\ Users\oddros')而不是'%USERPROFILE%'.我的MAVEN_OPTS现在看起来像这样:

-Djavax.net.ssl.trustStore=C:\Users\oddros\trust.jks -Djavax.net.ssl.trustStorePassword=changeit
Run Code Online (Sandbox Code Playgroud)


Rya*_*ton 6

我的 cacerts 文件完全是空的。我通过从我的 Windows 机器(使用 Oracle Java 7)复制 cacerts 文件并将其 scp 到我的 Linux 机器(OpenJDK)解决了这个问题。

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp
Run Code Online (Sandbox Code Playgroud)

然后在linux机器上

cp /tmp/cacerts /etc/ssl/certs/java/cacerts
Run Code Online (Sandbox Code Playgroud)

到目前为止效果很好。