NoSuchAlgorithmException: Алгоритм HmacSHA1, не доступный

Посмотрите на следующую строку Java:

Mac.getInstance("HmacSHA1");

Если я поместил это в простую тестовую программу, она работает без проблем на моем сервере. Однако, если я использую эту строку в контейнере, я добираюсь

java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
  at javax.crypto.Mac.getInstance(DashoA13*..)

Та же установка JDK используется в обоих случаях.

После поиска с помощью Google вокруг немного, мне удалось заставить это работать путем выполнения двух вещей:

  1. Копирование sunjce_provider.jar от $JAVA_HOME/jre/lib/ext к каталогу lib контейнера.
  2. Добавление следующей строки к моему коду:

    java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());

А именно, это происходит со мной в Apache James mailet, но я вполне уверен, это, имеет отношение к опциям JVM. Вот сценарий запуска, который это использует.

Хотя я заставил это работать в конце, решение чувствует себя слишком взломанным, чтобы быть правильным. Я ценил бы объяснение того, что продолжается, а также более "надлежащее" решение.

Связанный вопрос: Используя Java crypto приводит к NoSuchAlgorithmException. Однако в этом случае я вполне уверен, алгоритм HmacSHA1 должен поддерживаться из поля. Как доказательство, это работает без проблем в тестовой программе.

9
задан Community 23 May 2017 в 00:31
поделиться

1 ответ

Сценарий запуска устанавливает java.ext.dirs в свой собственный набор каталогов (специфичных для приложения), но без «обычного» каталога расширений ( $ JAVA_HOME / jre / lib / ext / ), где находится sunjce_provider.jar . Это объясняет ваш первый пункт (копирование файла Jar в каталог lib снова делает его видимым). Это легко воспроизвести.

Что касается второго пункта, я думаю, это связано с файлом политики, который сценарий запуска устанавливает с параметром -Djava.security.policy . Доступность некоторых поставщиков зависит от файлов политик. Файл политики по умолчанию делает доступным поставщик SunJCE, но, поскольку сценарии запуска требуют нестандартного настраиваемого файла политики, все работает. Предлагаю вам взглянуть на этот файл политики.

Например, в моей системе (Ubuntu Linux с Sun JVM 1.6.0_20 в пакете Ubuntu) файл политики по умолчанию находится в /etc/java-6-sun/security/java.security и содержит (среди прочего) следующие строки:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC

, которые определяют, какие провайдеры должны быть доступны по умолчанию. Судя по вашим симптомам, я думаю, что пользовательский файл политики сделал SunJCE недоступным, если он явно не зарегистрирован (что понятно, поскольку сценарий запуска также удалил доступ к файлу Jar, содержащему SunJCE ...).

11
ответ дан 3 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: