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 (в форме любой зависимости), то эта проблема может возникнуть, если будет выполнено следующее условие:
- Создание jar через опцию экспорта eclipse, то есть Export-> Runnable Jar File -> Libary Handling {извлечение необходимых библиотек в сгенерированный Jar}-> FINISH
Бум, теперь у вас проблемы, и вы столкнетесь с ошибкой, например, JCE не может аутентифицировать поставщика BC.
Причина вышеупомянутой проблемы заключается в том, что когда вы создаете банку с вариантом 1, чем вы фактически снова распаковываете банку BouncyCastle, что нарушает безопасность, связанную с BC. Итак, всякий раз, когда вы запускаете его снова, java проверяет его и обнаруживает, что текущий BC.jar в вашей связанной банке имеет ошибку.
Итак, ребята, убедитесь, что то, что вы делаете, оправдано, потому что, изменив данные безопасности JDK, которые заставят его работать, но не для всех.
Как заставить его работать?{Это будет работать только на локальном / персональном компьютере, а не на каждом компьютере}
- отредактируйте файл jre\lib\security\java.security
- добавить security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
- скопируйте 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, следующие шаги также решили мою проблему.
- добавьте Security.addProvider(новый org.bouncycastle.jce.provider.BouncyCastleProvider()) в своем классе.
- добавить предоставленную область видимости в bcprov.*.jar зависимость в pom.xml.
- поместите bcprov.*.jar в вашу конкретную папку (например: \lib), а затем передайте ее при запуске проекта.