Instalar Bouncy Castle en JBoss
java.lang.SecurityException: JCE cannot authenticate the provider BCo
java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: SHA1WithRSAEncryption, provider: BC, class: org.bouncycastle.jce.provider.JDKDigestSignature$SHA1WithRSAEncryption)
os contaré como he solucionado el problema.
En la documentación de Bouncy Castle nos comentan que hay varias formas de inicializar la librería.
De forma estática
Consiste en instalar la librería en nuestro JRE (Java Runtime Environment), y configurarlo como un proveedor de seguridad válido. Los pasos son los siguientes:
- Buscar el directorio de nuestro JRE
Dependiendo de nuestro sistema operativo (Windows, Linux, o Mac OS), el directorio del JRE se encuentra en un sitio distinto. Llamaremos JRE_HOME a este directorio. - Copiar la librería de Bouncy Castle en el siguiente directorio:
JRE_HOME/lib/ext
Yo he usado el fichero 'bcprov-jdk16-144.jar', que es la versión 1.44 de la librería, compilada para Java 6. - Editar el archivo JRE_HOME/lib/security
El contenido será algo como esto:security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
Sólo tendremos que añadir una línea más, añadiendo nuestro nuevo proveedor de seguridad, quedando de la siguiente forma:security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider
Nota: Como puedes observar, nosotros hemos añadido nuestro nuevo proveedor en la posición 9, pero esto puede variar de un sistema a otro. Hay que añadirlo el último.
De forma dinámica
Consiste en poner al principio de nuestro código una instrucción del tipo:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());
¿Pero que pasa si nuestra aplicación es una aplicación Web y tiene que funcionar en un servidor de aplicaciones como JBoss? En este caso la instrucción anterior afectará también al resto de aplicaciones instaladas en el servidor (ya que supongo que todas comparten el mismo ClassLoader), es decir, si una aplicación inicializa la librería, el resto de aplicaciones en el servidor también verán el proveedor Bouncy Castle como un proveedor disponible. Pero el problema no es ese, el problema es que si una aplicación intenta utilizar la librería Bouncy Castle, habiendo ésta sido inicializada en otra aplicación Web distinta, obtendremos el temido mensaje de: "JCE cannot authenticate the provider BC".
¿Como solucionamos esto? La solución consiste en no añadir la librería (fichero .jar) en el interior de nuestras aplicaciones Web (ficheros .war), sino de instalarla de forma global, en la propia instancia de JBoss. Para ellos sólo tendremos que seguir los siguientes pasos:
- Instalar la librería de Bouncy Castle (en nuestro caso el fichero 'bcprov-jdk16-144.jar') en el directorio:
JBOSS_HOME/server/INSTANCIA/lib
Donde JBOSS_HOME es el directorio donde tenemos instalado JBoss, e INSTANCIA es la instancia del servidor JBoss que estamos usando, normalmente 'default'. - En el código de nuestra aplicación Web, antes de utilizar cualquier función de la librería, escribir el siguiente código:
// Inicializa el Proveedor de Seguridad BouncyCastle
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)==null)
{
BouncyCastleProvider BC_provider = new BouncyCastleProvider();
Security.addProvider(BC_provider);
System.out.println("Cargado " + BC_provider.getInfo());
}
Nota para usuarios de Eclipse: Como he comentado antes, la librería (fichero .jar) de Bouncy Castle no puede quedar en el archivo .WAR. Por lo tanto, no debéis copiar la librería en el directorio WebContent/WEB-INF/lib del proyecto. Sin embargo, sí debéis poner la librería en el CLASSPATH del proyecto, para la aplicación compile correctamente.
Después de un tiempo sin muchos cambios, hoy 4 de Abril, ha habido una actualización general de los firmwares para los productos del 







