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*..)

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Для справки, при использовании SpongyCastle ошибка читается:

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

Дополнительная информация в эта проблема

Ответ 4

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

Мы пытались использовать bcprov-ext-jdk15on-162.jar, добавленный в classpath, включенный в каталоги lib JBoss, связанный с 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>

Ответ 5

Для меня проблема была в том, что 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 как -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

Ответ 6

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

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