この例外:Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
をGoogleで検索すると、複数の結果が表示されます。しかし、決定的な解決策はなく、推測のみです。
SSLを介して接続を開いて使用しようとすると、(少なくとも私の場合は)問題が発生します。私のWindowsマシンでは正常に動作しますが、Linuxマシン(Sunのjreがインストールされている)にデプロイすると、上記の例外で失敗します。
問題は、JREのデフォルトのトラストストアが何らかの理由で空になっていることです(32バイトのサイズですが、Windowsでは80kbです)。
jre/lib/security/cacerts
ファイルをWindowsからlinuxにコピーしたとき、うまくいきました。
問題は、なぜLinux jreに空のトラストストアがあるのですか?
これはAMI linuxを使用するAmazon EC2インスタンスで発生するため、一部のAmazonポリシーが原因である可能性があることに注意してください(Javaはプリインストールされていると思いますが、わかりません)
Linux向けの標準のSun JDKには、指定されたディレクトリ内のすべてのファイルが完全に問題なく使用できます。問題は、使用するインストールです。
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 The README for ca-証明書-Javaは最終的に実際の修正を示しました:
走る
update-ca-certificates -f
apt-get install ca-certificates-Javaが機能しませんでした。手動でインストール済みとしてマークしました。
次のようなダミーの証明書をキーストアに配置することで、このエラー(OSX 10.5.8上のJava 1.6.0)を回避しました。
keytool -genkey -alias foo -keystore cacerts -dname cn=test -storepass changeit -keypass changeit
質問は、「空のtrustStoreをJava処理できないのはなぜですか?」
元の質問に対する答えではありませんが、同様の問題を解決しようとすると、Mac OS XのMavericsへのアップデートがJavaインストール(実際にはcacert)を台無しにすることがわかりました。 Sudo rm -rf /Library/Java/JavaVirtualMachines/*.jdk
を削除し、 http://www.Oracle.com/technetwork/Java/javase/downloads/index.html から再インストールします
システムプロパティ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例外を正確に生成します。
一種の愚かな答えですが、私は再現できます。
Windowsでの私のソリューションは、管理者としてコンソールウィンドウを実行するか、環境変数MAVEN_OPTSを変更して、 '%USERPROFILE%'ではなくtrust.jks(たとえば、 'C:\ Users\oddros')へのハードコードパスを使用することでした。私のMAVEN_OPTSは次のようになりました。
-Djavax.net.ssl.trustStore=C:\Users\oddros\trust.jks -Djavax.net.ssl.trustStorePassword=changeit
Java-8-OracleがインストールされているUbuntu 14.10でも同じ問題が発生していました。
Ca-certificates-Javaパッケージのインストールを解決しました:
Sudo apt-get install ca-certificates-Java
私のcacertsファイルは完全に空でした。これを解決するには、cacertsファイルをWindowsマシン(Oracle Java 7を使用)からコピーし、Linuxボックス(OpenJDK)にscpします。
cd %Java_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp
そして、Linuxマシンで
cp /tmp/cacerts /etc/ssl/certs/Java/cacerts
これまでのところうまくいきました。
JRE /セキュリティに有効なcacertがあることを確認してください。そうしないと、無効な空の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
キーツールを使用して新しいキーツールを生成できることを理解しました( http://mail.openjdk.Java.net/pipermail/distro-pkg-dev/2010-April/008961.html )。私はおそらくすぐにそれにする必要があります。
よろしく
LinuxではなくMac OS Xに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で動作しますが、OSの以前のバージョンでは動作しません。
これは、アクセス権限がOSによって異なるために発生します。 Windowsアクセス階層はUnixとは異なります。ただし、これらの簡単な手順に従うことでこれを克服できます。
AccessController.doPrivileged(Java.security.PrivilegedAction subclass)
でアクセシビリティを向上Java.security.Provider
サブクラスをセキュリティプロパティとして設定します。 a。 Security.insertProviderAt(new、2);Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);
でアルゴリズムを設定しますC:\ Program Files\Java\jdk1.7.0_51\jre\lib\securityフォルダーにあるcacertsファイルのアクセス許可が正しく設定されていない場合、Windows 7マシンで同じエラーが発生します。
この問題を解決するには、SERVICEユーザーとINTERACTIVEユーザーにcacertsのすべての変更権限を許可しますexcept「権限の変更」および「所有権の取得」(詳細設定から)セキュリティプロパティの設定)。これらのサービスに拡張属性の読み取りと書き込みの両方を許可すると、エラーが消えるのと関係があると思います。
同じ問題があります。 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
追伸.
$ 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)