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不同。 但是,这可以通过以下简单的步骤来克服:
- 通过
AccessController.doPrivileged(java.security.PrivilegedAction subclass)
提高可访问性 - 将您自己的
java.security.Provider
子类设置为安全属性。 一个。 Security.insertProviderAt(new,2); - 使用
Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);
设置您的AlgorythmSecurity.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);
当我的C:\ Program Files \ Java \ jdk1.7.0_51 \ jre \ lib \ security文件夹中的cacerts文件的权限设置不正确时,我的Windows 7计算机上出现同样的错误。
为了解决这个问题, 除了 “更改权限”和“取得所有权”(从“高级设置”中的“安全属性”),我允许SERVICE和INTERACTIVE用户拥有对cacerts的所有修改权限。 我认为允许这些服务读取和写入扩展属性可能与错误消失有关。