JCE не может аутентифицировать провайдера BC в приложении Java Swing

Я создаю свинг-приложение в JAVA, которое использует некоторую технику шифрования. Но javax.crypto.KeyGenerator.getInstance("AES", "BC") дает исключение:

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
        at javax.crypto.SunJCE_b.a(DashoA13*..)
        at javax.crypto.KeyGenerator.getInstance(DashoA13*..)

Так в чем проблема?

8 ответов

Решение

Чтобы расширить комментарий от GregS, все JAR-провайдеры JCE должны быть подписаны, прежде чем они будут доверены вашей среде выполнения Java.

BouncyCastle покорно поставляет подписанные JAR-файлы, которые будут работать без проблем. Однако если вы извлекаете файлы классов из этого JAR-файла или перекомпилируете исходный код, он удалит подпись и заставит Java отклонить код.

Посмотрите этот связанный вопрос SO: Как подписать пользовательский поставщик безопасности JCE

1. отредактируйте jre\lib\security\java.security

добавить security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider

2. скопируйте bc*.jar в jre\lib\ext

Для тех, кто нашел эту проблему, но на самом деле использует SpongyCastleБыло бы интересно узнать, что в Android такого теста для подписи нет, и для своих тестов вы можете использовать SpongyCastle через openJDK-8, так как он не заботится о сигнатурах.

Для справки, с SpongyCastle ошибка гласит:

java.lang.SecurityException: JCE cannot authenticate the provider SC

Больше информации в этом выпуске

Мы страдаем от одной и той же проблемы в течение нескольких недель и безуспешно пробовали многие из предложенных шагов. Предлагаем наше решение ниже, чтобы другим не пришлось страдать, как мы!

Мы пытались использовать bcprov-ext-jdk15on-162.jar, добавленный в путь к классам, включенный в каталоги JBoss lib, связанный с WAR, помеченный как предоставленный и добавленный в каталоги JBoss /lib, но безуспешно.

В конце концов, мы попробовали разные версии bouncycastle и нашли менее свежую версию, подпись которой могла быть проверена jarsigner нашей конкретной версии Java (1.5X).

Несмотря на то, что подпись jar проверяется нашей версией Java, когда.jar упакован в WAR, подпись каким-то образом была аннулирована JBoss.

В конце концов, решение для нас было:

1. Add bouncycastle jar to JBoss classpath
2. Add 'org.bouncycastle.jce.provider.BouncyCastleProvider' to 'java.security' providers
3. Mark bouncycastle in your WAR as a 'provided' dependency

Когда у нас была версия.jar в нашем пути к классам и мы были уверены, что наша WAR не упаковывает ее, мы были золотыми.

Проблема, похоже, тесно связана с любой версией Java/JBoss, которую вы используете. Итак, если это решение не работает для вас, я бы предложил протестировать разные версии bouncycastle с помощью

jarsigner -verify <bouncycastle.jar>

Есть много решений этой проблемы, но, к сожалению, никто не говорит о причине.

Если вы создаете исполняемый файл jar, в котором есть BC.jar (в форме любой зависимости), то эта проблема может возникнуть, если будет выполнено следующее условие:

  1. Создание jar через опцию экспорта eclipse, то есть Export-> Runnable Jar File -> Libary Handling {извлечение необходимых библиотек в сгенерированный Jar}-> FINISH

Бум, теперь у вас проблемы, и вы столкнетесь с ошибкой, например, JCE не может аутентифицировать поставщика BC.

Причина вышеупомянутой проблемы заключается в том, что когда вы создаете банку с вариантом 1, чем вы фактически снова распаковываете банку BouncyCastle, что нарушает безопасность, связанную с BC. Итак, всякий раз, когда вы запускаете его снова, java проверяет его и обнаруживает, что текущий BC.jar в вашей связанной банке имеет ошибку.

Итак, ребята, убедитесь, что то, что вы делаете, оправдано, потому что, изменив данные безопасности JDK, которые заставят его работать, но не для всех.

Как заставить его работать?{Это будет работать только на локальном / персональном компьютере, а не на каждом компьютере}

  1. отредактируйте файл jre\lib\security\java.security
  2. добавить security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  3. скопируйте bc*.jar в jre\lib\ext

Вот и все.

Для меня проблема была bcprov-ext-jdk16.jar отбрасывался sbt assembly,

[warn] Merging 'META-INF/license/LICENSE.bouncycastle.txt' with strategy 'discard'
..
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.properties' with strategy 'discard'
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.xml' with strategy 'discard'
..

Так что я в конечном итоге с помощью bouncycastle.jar от -classpath как показано ниже,

java -Denvironment=dev -cp chat-server.jar:/Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar com.chat.server.ChatServer

То, что также работает, помещает bouncycastle.jar в $JAVA_HOME/jre/lib/ext ,

cp /Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar $JAVA_HOME/jre/lib/ext/

$ ls -l $JAVA_HOME/jre/lib/ext/
total 55208
-rw-r--r--  1 root  wheel   1887089 May  7 21:22 bcprov-ext-jdk16-1.46.jar
-rw-rw-r--  1 root  wheel   3860502 Sep  5  2017 cldrdata.jar
-rw-rw-r--  1 root  wheel      8286 Sep  5  2017 dnsns.jar
-rw-rw-r--  1 root  wheel     44516 Sep  5  2017 jaccess.jar
-rwxrwxr-x  1 root  wheel  18610276 Sep  5  2017 jfxrt.jar
-rw-rw-r--  1 root  wheel   1179093 Sep  5  2017 localedata.jar
-rw-rw-r--  1 root  wheel      1269 Sep  5  2017 meta-index
-rw-rw-r--  1 root  wheel   2022735 Sep  5  2017 nashorn.jar
-rw-rw-r--  1 root  wheel     41672 Sep  5  2017 sunec.jar
-rw-rw-r--  1 root  wheel    274148 Sep  5  2017 sunjce_provider.jar
-rw-rw-r--  1 root  wheel    248726 Sep  5  2017 sunpkcs11.jar
-rw-rw-r--  1 root  wheel     68924 Sep  5  2017 zipfs.jar

Просто используйте Open JDK, и проблема исчезнет. Я использовал openJDK21

К вашему сведению: вместо того, чтобы изменить java.security и скопировать jar в \ jre \ lib \ ext, следующие шаги также решили мою проблему.

  1. добавьте Security.addProvider(новый org.bouncycastle.jce.provider.BouncyCastleProvider()) в своем классе.
  2. добавить предоставленную область видимости в bcprov.*.jar зависимость в pom.xml.
  3. поместите bcprov.*.jar в вашу конкретную папку (например: \lib), а затем передайте ее при запуске проекта.
Другие вопросы по тегам