2012-04-30 3 views
13

Sigo estas instrucciones para agregar bouncycastle: http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation pero todavía tengo un problema. A veces, cuando vuelvo a implementar mi aplicación, no se encuentra este proveedor, por lo que mi aplicación lanza una excepción. Este problema ocurre solo uno por 100 redesplegar (quizás menos). Cuando reinicio mi servidor - weblogic, entonces comienza a funcionar nuevamente. Voy a ser muy agradecido por cualquier consejo por qué se produce este problemaBouncycastle no se puede cargar cuando vuelvo a desplegar la aplicación

EDIT:

estoy usando tanto el método en el enlace de arriba, porque cuando se utiliza sólo uno de ellos, entonces no trabaja agrego a esta java.security provder y luego en mi clase I registrado este provder:

static { 
    Security.addProvider(new BouncyCastleProvider()); 
} 
+0

El enlace que proporcionó da dos métodos, ¿cuál está utilizando? –

+0

ambos agrego a java.security este proveedor y luego en mi clase registré este provder: static { Security.addProvider (new BouncyCastleProvider()); } – hudi

+0

¿Puedes intentar solo usar el método estático? –

Respuesta

22

probablemente tiene un NoClassDefFoundError. Este es un problema conocido con las implementaciones de JSSE.

Aquí está el panorama:

  • Sus cargas de contenedores clases castillo hinchable en un cargador de clases para aplicaciones específicas
  • La instancia de proveedor se crea depende de que las clases y así sucesivamente que ClassLoader
  • A continuación, el proveedor es registrado en JRE API gracias a campos estáticos en el nivel superior JVM ClassLoader
  • Al volver a implementar, el contenedor descarta la aplicación ClassLoader para crear una nueva
  • Como el algoritmo ya se sabe, la segunda inserción proveedor falla en silencio
  • Cuando se utiliza el algoritmo de la instancia proveedor es simplemente inutilizable debido a que el cargador de clases ha sido descartada
  • entonces la única opción es reiniciar el contenedor para tener la situación fijada .

Como no existe un detector estándar para el evento de anulación de despliegue, no es posible desencadenar la eliminación del proveedor de JSSE en el momento.

La forma recomendada de evitar ese problema es tener clases de castillo hinchable en su JVM ClassPath o en su contenedor ClassPath. Tienes que eliminarlo de tu aplicación. Ahora necesita registrar el proveedor de BC con una opción alternativa al inicializador estático. WebLogic proporciona ways to trigger code at server startup (he utilizado la clase de inicio del servidor), este código será responsable de registrar los proveedores de JSSE para toda la vida útil del servidor/JVM.

Una opción alternativa es añadir la siguiente línea en JRE java.security archivo con hinchable frasco castillo jre/lib/ext, pero no me gusta de esa manera, ya que se puede perder cuando se actualiza: security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

Así entonces la aplicación simplemente espera que las implementaciones están allí, puede ser una buena idea agregar pruebas de disponibilidad de algoritmo para informar cualquier problema a los operadores y usuarios.

+0

Me he encontrado con el mismo problema y la respuesta de Yves es exactamente lo que lo resolvió. –

+0

hm muy buena respuesta. Lo intentaré, pero es muy difícil probar esto porque este problema ocurre solo en muy poco tiempo en montones de redespliegue. ¿Sabes por qué este problema ocurre solo algunas veces? Pero confío en A. R. Younce y establezco esta respuesta como correcta. thx mucho – hudi

+0

Cuando llegué primero el problema fue hace años y falla en cada redistribución. Probablemente WebLogic se haya mejorado para poder solucionar el problema. Principalmente depende si BC se ha usado efectivamente o no, o si todas las clases requeridas han sido cargadas/instanciadas al menos una vez o algunas faltan después de volver a implementarlas, como aquí https://forums.oracle.com/forums/thread.jspa?threadID = 2139251 –

10

puedo utilizar esta solución alternativa para implementar la aplicación en Tomcat:

public class GenSignCastle { 
    BouncyCastleProvider  bcProvider = null; 

public GenSignCastle() { 
    if (bcProvider == null) { 
     bcProvider = new BouncyCastleProvider(); 
     Provider[] providers = Security.getProviders(); 

     String name = bcProvider.getName(); 
     Security.removeProvider(name); // remove old instance 

     Security.addProvider(bcProvider); 
    } 
} 
. 
. 
. 
} 

Lo interesante es que tengo que quitar el BouncyCastleProvider primero en utilizar de nuevo después de redeploy.

+0

¡La eliminación del proveedor BC durante el proceso de cierre de la aplicación web funcionó a la perfección! – lazlev

0

este problema podría ser fácilmente resuelto por el siguiente código y uso del paquete sun.security.jce:

ProviderList list = Providers.getFullProviderList(); 
ProviderList.add(list, new BouncyCastleProvider()); 
Providers.beginThreadProviderList(list); 

la lista se extenderá a utilizar el proveedor castillo hinchable y se inyectará la nueva lista como un hilo local. esto podría usarse dentro de un servletfilter u otra cosa. tal vez sea necesario restablecer la lista al valor anterior después de que finalice la solicitud

Providers.endThreadProviderList(this.oldList); 
+0

Esto no parece funcionar (obtengo un 'Ningún proveedor instalado admite esta clave:'), por lo que puedo entender de JavaDoc, solo es utilizable internamente por el verificador JAR, no con el uso general de los proveedores de JCE. – lapo

Cuestiones relacionadas