java security jboss bouncycastle jce

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 ());

Fuente: jce no puede autenticar el proveedor bc


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.