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 .