2011-01-21 78 views
66

當谷歌的這個異常:java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty,多個結果出現。然而,沒有確切的解決方案,只能猜測。java.security.InvalidAlgorithmParameterException:在trustAnchors參數必須是在Linux上非空,或者爲什麼是默認信任的空

問題出現(在我的情況下,至少),當我嘗試使用開放通過SSL連接。它在我的Windows機器上工作正常,但是當我將它部署到Linux機器(安裝sun的jre)時,它會失敗並出現上述異常。

的問題是,JRE的默認信任是空的由於某種原因(僅32個字節的大小,而它是80KB的窗口上)。

當我從Windows到Linux的複製我的jre/lib/security/cacerts文件,它工作得很好。

問題是 - 爲什麼linux jre有一個空的信任存儲?

注意,這發生在Amazon EC2實例,與AMI Linux操作系統,所以它可能是由於一些政策亞馬遜(我認爲Java是預裝的,但我不知道)

回答

22

標準用於Linux的Sun JDK具有絕對可用的cacerts和所有指定目錄中的所有文件。問題是您使用的安裝。

+0

很好確認。也許這是與亞馬遜實例 – Bozho 2011-01-23 15:00:29

+0

是捆綁的JRE,你必須問供應商 – bestsss 2011-01-23 15:03:48

+2

我目前在這裏有同樣的問題。我使用了openjdk 7,默認情況下,它會創建一個到/ etc/ssl/certs/java/cacerts的符號鏈接,這在Amazon EC2上的ubuntu AMI上是空的。目前嘗試與太陽jdk。 – Cookie 2011-12-13 12:48:32

2

如果您遇到這種情況與OpenJDK的安裝在Mac OS X(而不是Linux的),和你有官方的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,不確定適用於早期版本的操作系統。

+2

在我的Mac OS X Maverics上,/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts不存在。 :-( – 2013-11-16 14:30:13

14

我已經把一個假證書在密鑰庫避免這個錯誤(Java 1.6.0在OSX 10.5.8),如

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

當然,問題應該是「爲什麼不能java的手柄一個空的信託商店?「

+0

我完全同意你最後的陳述,特別是因爲Java 6報告「java.lang.RuntimeException:意外的錯誤:[..],trustAnchors參數必須是非空的。」一個空的信任庫不應該是一個 – whaefelinger 2012-08-08 12:38:01

+0

謝謝 - 當我清除內部測試的密鑰庫並開始出現此錯誤時,也發生了這種情況。解決方案確實是添加了一個虛擬密鑰。 – Tor 2014-08-18 17:05:09

2

請確保您有在JRE /安全有效cacerts中,否則您將無法繞過無效空trustAnchors錯誤。

在我的亞馬遜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

0

有同樣的問題。通過從Mozilla安裝CA證書包解決它:

$ 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 

P.S.

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

猜測證書鏈是否被破壞?可能是這種情況對於Bozho來說也是如此 – Ren 2013-04-26 08:28:34

6

我在Windows的解決辦法是要麼運行控制檯窗口管理員或更改環境變量MAVEN_OPTS用來trust.jks硬編碼的路徑(如「C:\用戶\ oddros」),而不是「%USERPROFILE %」。我的MAVEN_OPTS現在看起來像這樣:

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

這是一個非常寶貴的提示,這也適用於我,但是,這個文件在絕對引用而不是相對引用的情況下工作很奇怪,儘管它很明顯是在相對引用中找到的。甚至加倍檢查相對路徑是有效的通過重命名該文件將出現錯誤,說該文件無法找到。 – omilke 2013-07-15 11:48:05

3

我的cacerts文件完全是空的。我通過從我的Windows機器上覆制cacerts文件(即使用Oracle Java 7)並將其解密到我的Linux機器(OpenJDK)來解決此問題。

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

,然後在Linux機器

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

它是偉大的工作,到目前爲止上。

0

發生這種情況是因爲Access Privilege因操作系統而異。 Windows訪問層次與Unix不同。然而,這可以通過以下這些簡單的步驟來克服:

  1. 增加無障礙與AccessController.doPrivileged(java.security.PrivilegedAction subclass)
  2. 設定自己的java.security.Provider子類作爲安全屬性。 a。 Security.insertProviderAt(new,2);
  3. 設置你的Algorythm與Security.setProperty("ssl.TrustManagerFactory.algorithm" , 「XTrust509」);
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異常。

有點愚蠢的答案,但我可以重現。

0

當我的C:\ Program Files \ Java \ jdk1.7.0_51 \ jre \ lib \ security文件夾中的cacerts文件的權限設置不正確時,我的Windows 7計算機上出現同樣的錯誤。

要解決此問題,我允許SERVICE和INTERACTIVE用戶對cacerts 擁有所有修改權限,但「更改權限」和「取得所有權」(從「高級設置」的「安全性」屬性中)除外。我認爲允許這些服務讀取和寫入擴展屬性可能與錯誤消失有關。

3

在安裝了java-8-oracle的Ubuntu 14.10上有同樣的問題。

解決安裝CA證書-java包:

sudo apt-get install ca-certificates-java 
88

我在Ubuntu得到這個錯誤。我看到/ etc/ssl/certs/java/cacerts中斷了/ usr/lib/jvm/java-8 -d openjdk-amd64/jre/lib/security/cacerts 。這使我這個錯誤: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/983302 自述爲CA證書-java的最終結果顯示實際的解決辦法:

運行

update-ca-certificates -f 

的apt-get安裝CA證書的Java沒有爲工作我。它只是將其標記爲手動安裝。

相關問題