java.security.InvalidAlgorithmParameterException:Linux上的trustAnchors参数必须为非空,或者为啥默认的信任库为空[重复]

Posted

技术标签:

【中文标题】java.security.InvalidAlgorithmParameterException:Linux上的trustAnchors参数必须为非空,或者为啥默认的信任库为空[重复]【英文标题】:java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty on Linux, or why is the default truststore empty [duplicate]java.security.InvalidAlgorithmParameterException:Linux上的trustAnchors参数必须为非空,或者为什么默认的信任库为空[重复] 【发布时间】:2011-06-13 11:18:44 【问题描述】:

当您搜索此异常时: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 是预装的,但我不确定)

【问题讨论】:

对于那些运行bazel并遇到此错误消息的用户,请记住将您的$JAVA_HOME设置为正确的位置。 【参考方案1】:

我在 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

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

【讨论】:

不错!阅读了很多关于这个的讨论,这个命令为我修复了它。 我在使用 Scaleway Debian jessie 发行版时遇到了这个问题。这个答案实际上解决了这个问题。但是,-f 可能会删除任何手动添加的证书-f, --fresh Fresh updates. Remove symlinks in /etc/ssl/certs directory. 这应该是最受接受的答案【参考方案2】:

适用于 linux 的标准 Sun JDK 在指定目录中的 cacerts 和所有文件都绝对可以。问题在于您使用的安装。

【讨论】:

很高兴确认。也许是亚马逊实例捆绑的 JRE 是的,你得问供应商 我目前在这里遇到同样的问题。我使用了 openjdk 7,它默认创建一个指向 /etc/ssl/certs/java/cacerts 的符号链接,在 Amazon EC2 上的 ubuntu AMI 上它是空的。目前正在尝试使用 sun jdk。 顺便说一句,我尝试通过将我的 windows cacerts 复制到上述位置来修复上述问题,但这对我没有帮助。 我确认它适用于 sun 的 jdk。在Ubuntu上,安装sun jdk后使用sudo update-alternatives --config java切换。【参考方案3】:

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

keytool -genkey -alias foo -keystore cacerts -dname cn=test -storepass changeit -keypass changeit

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

【讨论】:

我完全同意你最后的说法。特别是因为 Java 6 报告“java.lang.RuntimeException: Unexpected error: [..] trustAnchors 参数必须非空”。一个空的信任库不应该是人们所期望的,即不信任任何人。 谢谢 - 当我清除密钥库以进行内部测试并开始收到此错误时,也发生了这种情况。解决方案确实是添加一个虚拟密钥。 OSX - 虚拟键没有帮助。【参考方案4】:

我可以通过将系统属性 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");

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

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

【讨论】:

这帮助我们解决了问题。当它只是一个简单的“找不到文件”时,我们正在为“trustAnchors 参数必须非空”而苦苦挣扎。 在我的情况下,路径是好的,,但是忘记在文件名中添加 .jks 扩展名......干杯 感谢您发布此信息!忘记定义密码...【参考方案5】:

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

解决安装 ca-certificates-java 包:

sudo apt-get install ca-certificates-java

【讨论】:

谢谢,这对我有用。 完美,这对我来说也太棒了! 我可以使用 java-8-oracle 和 Ubuntu 18.04.1 LTS【参考方案6】:

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

【讨论】:

是的,这里也是。我认为那是因为升级 在 Mavericks 升级后,当 Java 代码尝试建立 SSL 连接时,我得到“java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须非空”。重新安装 Java 6 为我解决了这个问题。【参考方案7】:

我在 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

【讨论】:

这是一个非常宝贵的提示。这也对我有用。然而,该文件使用绝对引用而不是相对引用是相当奇怪的,即使它显然是通过相对引用找到的。我什至通过重命名文件来双重检查相对路径是否有效,会发生错误,说找不到文件。 这对我也有用。我正在修改 IntelliJ Idea 中的运行配置。谢谢。 菜鸟问题。你从哪里得到.jks .jks 是使用 openssl 中的 keytool-command 生成的。请参阅此处的“以 JKS 格式创建密钥库”部分:docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html【参考方案8】:

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

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

然后在linux机器上

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

到目前为止效果很好。

【讨论】:

FWIW 这对我在 Ubuntu 15.04 上的 OpenJDK 8 有效。我按照建议从 Windows 7 笔记本电脑的路径“C:\Program Files (x86)\Java\jre1.8.0_31\lib\security”中提取了 cacerts 文件。【参考方案9】:

如果您在 Mac OS X(而不是 Linux)上安装 OpenJDK 时遇到这种情况,并且您确实通过软件更新安装了官方 Mac OS X Java(即最新的 Java 6),您可以这样做:

cd $OPENJDK_HOME/Contents/Home/jre/lib/security
ln -s /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
ln -s /System/Library/Java/Support/Deploy.bundle/Contents/Home/lib/security/blacklist 
ln -s /System/Library/Java/Support/Deploy.bundle/Contents/Home/lib/security/trusted.libraries 

其中$OPENJDK_HOME 是您的OpenJDK 安装的根目录,通常是OPENJDK_HOME=/Library/Java/JavaVirtualMachines/1.7.0u.jdk。这与 Mac OS X 上官方 Java 安装获取这些文件的方式相同——它们也只是从这些系统包中符号链接它们。适用于 Lion,不确定是否适用于早期版本的操作系统。

【讨论】:

在我的 Mac OS X Maverics 上,/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts 不存在。 :-(【参考方案10】:

确保您在 JRE/security 中有有效的 cacerts,否则您将无法绕过 invalid empty trustAnchors 错误。

在我的 Amazon EC2 Opensuse12 安装中,问题是 JRE 安全目录中的 cacerts 指向的文件无效:

$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (suse-3.20.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

$ ls -l /var/lib/ca-certificates/
-rw-r--r-- 1 root    363 Feb 28 14:17 ca-bundle.pem

$ ls -l /usr/lib64/jvm/jre/lib/security/
lrwxrwxrwx 1 root    37 Mar 21 00:16 cacerts -> /var/lib/ca-certificates/java-cacerts
-rw-r--r-- 1 root  2254 Jan 18 16:50 java.policy
-rw-r--r-- 1 root 15374 Jan 18 16:50 java.security
-rw-r--r-- 1 root    88 Jan 18 17:34 nss.cfg

所以我解决了安装旧的 Opensuse 11 有效证书的问题。 (对不起!)

$ ll
total 616
-rw-r--r-- 1 root 220065 Jan 31 15:48 ca-bundle.pem
-rw-r--r-- 1 root    363 Feb 28 14:17 ca-bundle.pem.old
-rw-r--r-- 1 root 161555 Jan 31 15:48 java-cacerts

我了解到您可以使用 keytool 生成一个新的 (http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008961.html)。我可能很快就会这样做。

问候 莱利斯

【讨论】:

【参考方案11】:

有同样的问题。通过安装 Mozilla 的 ca-certificate bundle 解决了这个问题:

$ zypper in ca-certificates-mozilla
The following NEW package is going to be installed:
ca-certificates-mozilla 

1 new package to install.
Retrieving package ca-certificates-mozilla-1.85-8.8.1.noarch
(1/1), 143.7 KiB (239.1 KiB unpacked)
Retrieving: ca-certificates-mozilla-1.85-8.8.1.noarch.rpm.....................[done]
Installing: ca-certificates-mozilla-1.85-8.8.1 ...............................[done]
Additional rpm output:
Updating certificates in /etc/ssl/certs...
144 added, 0 removed.
creating /var/lib/ca-certificates/ca-bundle.pem ...
creating /var/lib/ca-certificates/java-cacerts ...
144 added, 0 removed.

$ ll /var/lib/ca-certificates/
total 392
drwxr-xr-x  2 root root   4096 Apr 26 07:25 ./
drwxr-xr-x 30 root root   4096 Apr 25 15:00 ../
-rw-r--r--  1 root root 220196 Apr 26 07:25 ca-bundle.pem
-rw-r--r--  1 root root 161555 Apr 26 07:25 java-cacerts

附言

$ cat /etc/SuSE-release
openSUSE 12.2 (x86_64)
VERSION = 12.2
CODENAME = Mantis
$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (suse-3.20.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

【讨论】:

猜测证书链已损坏? Bozho 也可能是这种情况。【参考方案12】:

发生这种情况是因为访问权限因操作系统而异。 Windows 访问层次结构与 Unix 不同。然而,这可以通过以下简单的步骤来克服:

    使用AccessController.doPrivileged(java.security.PrivilegedAction subclass) 增加可访问性 将您自己的java.security.Provider 子类设置为安全属性。 一种。 Security.insertProviderAt(new , 2); 使用Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”); 设置您的算法

【讨论】:

【参考方案13】:

当我的 C:\Program Files\Java\jdk1.7.0_51\jre\lib\security 文件夹中的 cacerts 文件的权限设置不正确时,我在 Windows 7 机器上遇到了同样的错误。

为了解决这个问题,我允许 SERVICE 和 INTERACTIVE 用户对 cacerts 除了“更改权限”和“取得所有权”(来自高级设置,在安全属性中)拥有所有修改权限。我认为允许这些服务读取和写入扩展属性可能与错误消失有关。

【讨论】:

以上是关于java.security.InvalidAlgorithmParameterException:Linux上的trustAnchors参数必须为非空,或者为啥默认的信任库为空[重复]的主要内容,如果未能解决你的问题,请参考以下文章