Ответ 1
Не развертывайте банку bouncy-castle как часть вашего веб-приложения (WEB-INF/lib). Конечно, этот файл нужен во время компиляции, но на JBOSS он должен быть здесь:
$JBOSS_HOME/server/default/lib/
вместо
yourapp/WEB-INF/lib
Я использую BouncyCastle для шифрования в своем приложении. Когда я запускаю его автономно, все работает нормально. Однако, если я помещаю его в webapp и развертываю на сервере 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>
Вы знаете, как я могу его развернуть?
Не развертывайте банку bouncy-castle как часть вашего веб-приложения (WEB-INF/lib). Конечно, этот файл нужен во время компиляции, но на JBOSS он должен быть здесь:
$JBOSS_HOME/server/default/lib/
вместо
yourapp/WEB-INF/lib
Для 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>
Как только вы настроите модуль, вам нужно сделать его доступным для развертывания. Существует два способа:
В $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 и т.д.)
Добавьте запись зависимости модуля в файл уха 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>
Но если вы меняете сервер с 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-сервер.
Как я добавил в какой-то другой поток, его можно также добавить программно, поставив строку:
Security.addProvider(новый org.bouncyastle.jce.provider.BouncyCastleProvider());