it-swarm.com.ru

java.security.InvalidAlgorithmParameterException: параметр trustAnchors должен быть непустым в Linux, или почему хранилище доверенных сертификатов по умолчанию пусто

Когда вы Google для этого исключения: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty, появляются несколько результатов. Однако нет окончательного решения, только догадки.

Проблема возникает (по крайней мере, в моем случае), когда я пытаюсь использовать открытое соединение через SSL. Он отлично работает на моей машине с Windows, но когда я разверну его на машине с Linux (с установленным jre от Sun), произойдет сбой с вышеуказанным исключением.

Проблема в том, что хранилище доверенных сертификатов JRE по умолчанию по какой-то причине пусто (размер всего 32 байта, тогда как в Windows оно составляет 80 КБ).

Когда я скопировал мой jre/lib/security/cacerts файл из windows в linux, он работал нормально.

Вопрос в том, почему у linux jre пустое хранилище доверия?

Обратите внимание, что это происходит в экземпляре Amazon EC2 с Linux linux, так что это может быть связано с некоторыми политиками Amazon (я думаю, что Java была предварительно установлена, но я не уверен)

70
Bozho

Стандартный Sun JDK для linux имеет абсолютно нормальные cacerts и все файлы в указанном каталоге. Проблема в установке, которую вы используете.

25
bestsss

Я получил эту ошибку в 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 README для ca -sertificates-Java в конце концов показал фактическое исправление:

бежать

update-ca-certificates -f

apt-get install ca-certificate-Java у меня не работает Он просто помечен как установленный вручную.

98
user988346

Я избежал этой ошибки (Java 1.6.0 на OSX 10.5.8), поместив фиктивный сертификат в хранилище ключей, например

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

Конечно, вопрос должен звучать так: «Почему Java не может обработать пустой trustStore?»

14
Andrew

Не ответ на первоначальный вопрос, но, пытаясь решить аналогичную проблему, я обнаружил, что обновление Macver X для Maverics испортило установку Java (фактически, cacert). Удалите Sudo rm -rf /Library/Java/JavaVirtualMachines/*.jdk и переустановите из http://www.Oracle.com/technetwork/Java/javase/downloads/index.html

9
Manuel Darveau

Я могу создать эту ошибку, установив системное свойство 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, указанное выше.

Вид глупого ответа, но я могу воспроизвести.

7
The Camster

Мое решение в 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
6
superodde

Была такая же проблема на Ubuntu 14.10 с установленной Java-8-Oracle.

Решена установка пакета ca-Certificates-Java: 

Sudo apt-get install ca-certificates-Java
5
Daniele Dellafiore

Мой файл cacerts был полностью пуст. Я решил эту проблему, скопировав файл cacerts с моего компьютера с Windows (который использует Oracle Java 7) и скопировал его на мою Linux-коробку (OpenJDK). 

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

а затем на машине Linux

cp /tmp/cacerts /etc/ssl/certs/Java/cacerts

Пока все отлично работает.

3
Ryan Shillington

Убедитесь, что в JRE/security у вас есть действительные кадры, иначе вы не сможете обойти недопустимую пустую ошибку trustAnchors.

В моей установке Amazon EC2 Opensuse12 проблема заключалась в том, что файл, указанный cacerts в каталоге безопасности JRE, был неверным:

$ 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

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
Attila Szegedi

Это происходит потому, что Access Privilege варьируется от ОС к ОС. Иерархия доступа к Windows отличается от Unix. Однако это можно преодолеть, выполнив следующие простые шаги:

  1. Увеличьте доступность с AccessController.doPrivileged(Java.security.PrivilegedAction subclass)
  2. Установите свой собственный подкласс Java.security.Provider в качестве свойства безопасности . A. Security.insertProviderAt (новый, 2);
  3. Установите свой алгоритм с помощью Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);
0
Pijush

Я получаю ту же ошибку на своем компьютере с Windows 7, когда права доступа к файлу cacerts в моей папке C:\Program Files\Java\jdk1.7.0_51\jre\lib\security установлены неправильно.

Чтобы разрешить эту проблему, я разрешаю пользователям SERVICE и INTERACTIVE иметь все разрешения на изменение для cacerts кроме "change permissions" и "владеть" (из расширенных настроек, в свойствах Security). Я предполагаю, что разрешение этим службам читать и записывать расширенные атрибуты может иметь отношение к исчезновению ошибки.

0
Fuzzy Analysis

Есть такая же проблема. Решил это, установив пакет сертификатов ca от Mozilla:

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