bouncycastle + JBoss AS7: JCE не может аутентифицировать провайдера BC - PullRequest
24 голосов
/ 02 марта 2012

Я использую 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>

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

Ответы [ 5 ]

45 голосов
/ 01 мая 2012

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

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 теперь будут доступны ввсе приложения (и это будет «эмулировать» добавление в classpath, как это было возможно в 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>
14 голосов
/ 02 марта 2012

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

$JBOSS_HOME/server/default/lib/

вместо

yourapp/WEB-INF/lib
13 голосов
/ 01 июля 2013

Но если вы смените сервер с 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

добавьте вашего провайдера BC

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.

0 голосов
/ 12 июля 2018

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

<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>  

добавление банок надувных замков с использованием use-physical-source-source работает для меня

0 голосов
/ 03 декабря 2015

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

Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider ());

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

...