java - bouncycastle+JBoss AS7: JCE no puede autenticar al proveedor BC
security (5)
Yo uso BouncyCastle para el cifrado en mi aplicación. Cuando lo ejecuto de forma independiente, todo funciona bien. Sin embargo, si lo pongo en la aplicación web y lo implemento en el servidor JBoss, aparece el siguiente error:
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)
Aquí hay una parte del código que causa este error:
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());
Y la dependencia de Maven:
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcmail-jdk16</artifactId>
<version>140</version>
</dependency>
¿Sabes cómo podría desplegarlo?
Como puse en otro hilo, también se puede agregar mediante programación al poner la línea:
Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider ());
No instale el tarro de bouncy-castle como parte de su aplicación web (WEB-INF / lib). Necesitará este archivo en tiempo de compilación, por supuesto, pero en JBOSS debería estar aquí:
$JBOSS_HOME/server/default/lib/
en lugar de
yourapp/WEB-INF/lib
Para JBoss AS7 el castillo hinchable debe implementarse como un módulo de servidor. Esto reemplaza el mecanismo server/default/lib
de versiones anteriores (como se menciona en la respuesta de Gergely Bacso).
JBoss AS7 utiliza jdk1.6 +. Cuando usamos JBoss AS7 con jdk1.6 necesitamos asegurarnos de que estamos usando bcprov-jdk16.
Cree un módulo Jboss (una carpeta $ JBOSS_HOME / modules / org / bouncycastle / main). Coloca en él los botes bouncy castle que deseas que estén disponibles a nivel mundial, junto con un archivo module.xml
que tiene este aspecto:
<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>
Una vez que haya configurado el módulo, debe ponerlo a disposición de sus implementaciones. Hay dos maneras:
1. A nivel mundial a través de standalone.xml
En $ JBOSS_HOME / standalone / configuration / standalone.xml reemplazar
<subsystem xmlns="urn:jboss:domain:ee:1.0"/>
con
<subsystem xmlns="urn:jboss:domain:ee:1.0">
<global-modules>
<module name="org.bouncycastle" slot="main"/>
</global-modules>
</subsystem>
Las bibliotecas jar ahora estarán disponibles en todas las aplicaciones (y esto "emulará" la adición a classpath como fue posible en jboss 4,5,6, etc.)
2. Para un despliegue específico (preferido)
Agregue una entrada de dependencia de módulo al archivo META-INF/jboss-deployment-structure.xml
del oído, en la sección, por ejemplo:
<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>
Para aquellos que no quieren cambiar la configuración de nivel de servidor,
<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>
agregando los botes de castillo inflable con use-physical-code-source funcionó para mí
Pero si cambia el servidor de JBoss a otro (por ejemplo, Glassfish) tiene el mismo problema.
La mejor solución para mí son los cambios en jdk.
Debe agregar Bouncy Castle a los proveedores de seguridad en su plataforma Java en dos pasos:
1. Copie las bibliotecas BC (actualmente bcpkix-jdk15on-149.jar, bcprov-jdk15on-149.jar) en el directorio $ JAVA_HOME / jre / lib / ext /
2. Registre el proveedor de BC: edite el archivo $ JAVA_HOME / jre / lib / security / java.security y bajo la línea
security.provider.1=sun.security.provider.Sun
agregue su proveedor de BC
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
Cambiar números de proveedores de descanso. Todo el bloque de proveedores debe ser similar a:
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
Y ahora solo debes reiniciar el servidor java.