bouncycastle + JBoss AS7: JCE не может аутентифицировать поставщика BC

Я использую BouncyCastle для шифрования в своем приложении. Когда я запускаю его отдельно, все работает нормально. Однако, если я помещу его в веб-приложение и разверну на сервере JBoss, я получу следующую ошибку:

javax.servlet.ServletException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.lang.Exception: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.io.IOException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
    org.bouncycastle.jce.provider.JDKPKCS12KeyStore.engineLoad(Unknown Source)
    java.security.KeyStore.load(Unknown Source)

Вот часть кода, которая вызывает эту ошибку:

    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)
    {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    // Read the Private Key
    KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
    ks.load(new FileInputStream(certificatePath), privateKeyPassword.toCharArray());

И зависимость maven:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcmail-jdk16</artifactId>
    <version>140</version>
</dependency>

Вы знаете, как я могу развернуть его?


person mrzasa    schedule 02.03.2012    source источник


Ответы (5)


Не развертывайте банку с надувным замком как часть вашего веб-приложения (WEB-INF/lib). Конечно, этот файл понадобится вам во время компиляции, но в JBOSS он должен быть здесь:

$JBOSS_HOME/server/default/lib/

вместо

yourapp/WEB-INF/lib
person Gergely Bacso    schedule 02.03.2012
comment
Почему это так? - person Roy Truelove; 05.12.2015
comment
Я использую jboss-eap-6.4 в JDK 1.8, и у меня нет каталога сервера - person Hosein Aqajani; 17.05.2016
comment
Это было все, что мне было нужно, я действительно рад, что это принятый ответ. +1 - person forresthopkinsa; 01.02.2017

Для JBoss AS7 надувной замок необходимо развернуть как серверный модуль. Это заменяет механизм server/default/lib более ранних версий (как упоминалось в ответе Gergely Bacso).

JBoss AS7 использует jdk1.6+. При использовании JBoss AS7 с jdk1.6 нам нужно убедиться, что мы используем bcprov-jdk16.

Создайте модуль Jboss (папка $JBOSS_HOME/modules/org/bouncycastle/main). Поместите в него банки с надувными замками, которые вы хотите сделать глобально доступными, вместе с файлом module.xml, который выглядит следующим образом:

<module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">
    <resources>
        <resource-root path="bcprov-jdk16-1.46.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api" slot="main" export="true"/>
    </dependencies>
</module>

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

1. Глобально через standalone.xml

В $JBOSS_HOME/standalone/configuration/standalone.xml замените

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>

с

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="org.bouncycastle" slot="main"/>
    </global-modules>
</subsystem>

Библиотеки jar теперь будут доступны во всех приложениях (и это будет «эмулировать» добавление в путь к классам, как это было возможно в jboss 4,5,6 и т. д.).

2. Для конкретного развертывания (предпочтительно)

Добавьте запись зависимости модуля в файл META-INF/jboss-deployment-structure.xml уха в разделе, например:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <dependencies>
            <module name="org.bouncycastle" slot="main" export="true" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
person James    schedule 01.05.2012
comment
В чем причина этого? Почему он работает, если он запускается автономно и должен быть модулем при запуске в JBoss? Модули не проверены, но есть банка внутри WEB-INF/lib? - person Jens; 30.08.2012
comment
серьезно, вы меня спасли :) я получал ту же ошибку с провайдером RSA JSAFE, но теперь смог избавиться от нее с помощью этого обходного пути. Большое спасибо - person Dungeon Hunter; 24.11.2014
comment
В wildfly-9.0.2.Final папка модуля для BouncyCastle уже существует по адресу <HOME>/modules/system/layers/base/org/bouncycastle/main/, поэтому вам нужно только сделать ее доступной для ваших развертываний (глобально или для одного приложения). Также обратите внимание, что в standalone.xml подсистема "urn:jboss:domain:ee" уже существует, поэтому вам нужно только добавить тег <global-modules> к ее содержимому. - person Pino; 10.08.2016
comment
@Pino, не могли бы вы предоставить более подробную информацию с примером для новичка. - person Awanish Kumar; 01.07.2017
comment
@Awanish Мой комментарий - это небольшое обновление основного ответа. Обратитесь к ответу за описанием изменений, которые вы должны внести в xml Wildfly. - person Pino; 01.07.2017

Но если Вы меняете сервер с JBoss на другой (например Glassfish) у Вас такая же проблема.
Лучшее решение для меня это изменения в jdk.
Вы должны добавить Bouncy Castle в провайдеры безопасности на Вашей java платформе в два шага:
1. Скопируйте библиотеки BC (в настоящее время bcpkix-jdk15on-149.jar, bcprov-jdk15on-149.jar) в каталог $JAVA_HOME/jre/lib/ ext/
2. Зарегистрируйте провайдера BC: отредактируйте файл $JAVA_HOME/jre/lib/security/java.security и подчеркните строку

security.provider.1=sun.security.provider.Sun

добавить своего провайдера БК

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

Изменить номера остальных провайдеров. Весь блок провайдеров должен быть похож на:

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

И теперь вам нужно просто перезапустить сервер Java.

person Krzysztof Szewczyk    schedule 01.07.2013
comment
Извините, вам не нужно менять поставщиков. Просто добавьте под SunPCSC провайдера следующее количество провайдеров, например: security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider БК провайдер не обязательно должен быть вторым. Может быть, последний. - person Krzysztof Szewczyk; 05.07.2013
comment
@KrzysztofSzewczyk Но не нужен ли здесь провайдеру замка наград самый высокий провайдер, то есть 1. Поскольку здесь приоритет будет отдаваться от 1 до 10. - person frewper; 11.07.2016

Как я добавил в какой-то другой поток, его также можно добавить программно, поместив строку:

Security.addProvider(новый org.bouncycastle.jce.provider.BouncyCastleProvider());

Источник: jce не может аутентифицировать провайдера bc

person Lukasz    schedule 03.12.2015

Для тех, кто не хочет менять конфигурацию уровня сервера,

<jboss-deployment-structure>  
   <deployment>  
      <resources>  
         <resource-root path="WEB-INF/lib/bcprov-jdk16-1.46.jar" use-physical-code-source="true"/>  
      </resources>  
   </deployment>  
</jboss-deployment-structure>  

добавление банок с надувным замком с использованием источника физического кода сработало для меня

person David John    schedule 12.07.2018