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

当你的谷歌这个exception: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty ,多个结果出现。 但是没有确切的解决办法,只能猜测。

问题出现了(至less在我的情况下),当我尝试使用通过SSL打开连接。 它可以在我的Windows机器上正常工作,但是当我将它部署到Linux机器(安装sun的jre)时,会失败,出现上述exception。

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

当我把我的jre/lib/security/cacerts文件从windows复制到linux时,它工作正常。

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

请注意,这发生在一个Amazon EC2实例,AMI Linux,所以这可能是由于一些亚马逊政策(我认为Java是预先安装的,但我不确定)

标准的Sun JDK for linux有一个绝对可靠的cacerts和全部指定目录中的所有文件。 问题是您使用的安装。

我在Ubuntu中得到这个错误。 我看到/ usr / lib / jvm / java-8-openjdk-amd64 / jre / lib / security / cacerts是/ etc / ssl / certs / java / cacerts的断开连接。 这导致我到这个bug: 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没有为我工作。 它只是标记为手动安装。

我已经通过在keystore中放置一个伪证书来避免这个错误(OSX 10.5.8上的Java 1.6.0),比如

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

当然问题应该是“为什么Java不能处理一个空的信任库?”

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

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

 -Djavax.net.ssl.trustStore=C:\Users\oddros\trust.jks -Djavax.net.ssl.trustStorePassword=changeit 

我可以通过将系统属性trustStore设置为缺less的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"); 

由于某些原因,此代码不会生成FileNotFoundexception,但确切地说是上面列出的InvalidAlgorithmParameterexception。

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

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

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

然后在linux机器上

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

到目前为止效果很好。

在安装了java-8-oracle的Ubuntu 14.10上有相同的问题。

解决安装ca-certificates-java包:

 sudo apt-get install ca-certificates-java 

如果在Mac OS X(而不是Linux)上使用OpenJDK进行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 。 这与官方的Java在Mac OS X上安装如何获取这些文件是一样的 – 它们也只是从这些系统包中将它们符号链接起来。 适用于Lion,不确定适用于早期版本的操作系统。

确保在JRE / security中有有效的cacerts,否则不会绕过无效的空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 )。 我很可能会很快

问候lellis

有同样的问题。 通过从Mozilla安装ca-certificate包解决它:

 $ 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 

PS

 $ 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) 

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

  1. 通过AccessController.doPrivileged(java.security.PrivilegedAction subclass)提高可访问性
  2. 将您自己的java.security.Provider子类设置为安全属性。 一个。 Security.insertProviderAt(new,2);
  3. 使用Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);设置您的Algorythm Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);

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

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