Перейти к основному содержимому

Ошибка: «параметр trustAnchors должен быть непустым»

· 3 мин. чтения

1. Обзор

В этом уроке мы объясним, что такое якорь доверия. Кроме того, мы покажем расположение TrustStore по умолчанию и ожидаемый формат файла. Наконец, уточним причины ошибки: « java.security.InvalidAlgorithmParameterException : параметр Trust Anchors должен быть непустым».

2. Определение якоря доверия

Давайте сначала объясним, что такое якорь доверия . В криптографических системах якорь доверия определяет корневой объект, для которого предполагается и выводится доверие . В таких архитектурах, как X.509, корневой сертификат является якорем доверия. Кроме того, корневой сертификат гарантирует доверие ко всем другим сертификатам в цепочке.

3. Расположение и формат TrustStore

Давайте теперь посмотрим на расположение и формат TrustStore в Java. Во-первых, Java ищет TrustStore в двух местах (по порядку):

  • $JAVA_HOME/библиотека/безопасность/jssecacerts
  • $JAVA_HOME/библиотека/безопасность/cacerts

Мы можем перезаписать местоположение по умолчанию с помощью параметра -Djavax.net.ssl.trustStore.

Кроме того, параметр -Djavax.net.ssl.trustStorePassword позволяет указать пароль для TrustStore . Наконец, команда выглядит так:

java -Djavax.net.ssl.trustStore=/some/loc/on/server/ our_truststore.jks -Djavax.net.ssl.trustStorePassword=our_password -jar application.jar

Более того, JKS является форматом TrustStore по умолчанию . Параметр -Djavax.net.ssl.trustStoreType позволяет перезаписать тип TrustStore по умолчанию .

Давайте посмотрим на вывод утилиты keytool в Java 16, выполненной для $JAVA_HOME/lib/security/cacerts :

$ keytool -list -cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 90 entries
....

Как и ожидалось, тип KeyStore — JKS. Кроме того, мы получили все 90 сертификатов, хранящихся в файле.

4. Причины исключения

Теперь давайте посмотрим на исключение « java.security.InvalidAlgorithmParameterException : параметр trustAnchors должен быть непустым».

Во-первых, среда выполнения Java создает исключение InvalidAlgorithmParameterException только в классе PKIXParameters , который используется для чтения сертификатов из хранилища ключей . Конструктор PKIXParameters собирает trustAnchors из KeyStore, заданного в качестве параметра.

Исключение возникает, когда в предоставленном KeyStore нет trustAnchors :

...
if (trustAnchors.isEmpty()) {
throw new InvalidAlgorithmParameterException("the trustAnchors " +
"parameter must be non-empty");
}
...

Попробуем воспроизвести случай. Во-первых, давайте создадим пустое хранилище ключей :

private KeyStore getKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, "changeIt".toCharArray());
return ks;
}

Теперь давайте проверим создание экземпляра класса PKIXParameters :

@Test
public void whenOpeningTrustStore_thenExceptionIsThrown() throws Exception {
KeyStore keyStore = getKeyStore();
InvalidAlgorithmParameterException invalidAlgorithmParameterException =
Assertions.assertThrows(InvalidAlgorithmParameterException.class, () -> new PKIXParameters(keyStore));
Assertions.assertEquals("the trustAnchors parameter must be non-empty", invalidAlgorithmParameterException.getMessage());
}

То есть конструктор выдал исключение, как и ожидалось. Другими словами, невозможно создать экземпляр класса PKIXParameters , если в данном KeyStore нет доверенных сертификатов .

5. Вывод

В этой короткой статье мы описали, что такое якорь доверия. Затем мы показали расположение TrustStore по умолчанию и формат файла. Наконец, мы показали причины ошибки «параметр доверия якоря не должен быть пустым».

Как всегда, исходный код примера доступен на GitHub .