Biblioteca del proveedor de criptografía BouncyCastle utilizada con un applet en Java 7u40
code-signing jarsigner (2)
El caso: estoy manteniendo un applet de Java que usa las bibliotecas BouncyCastle bcpkix-jdk15on-149.jar , y bcprov-jdk15on-149.jar .
El problema es cuando el applet se ejecuta en un navegador habilitado para JRE versión 7_u40.
El comportamiento ha cambiado desde la versión 7_u25 de manera que siempre solicita una ventana modal como "Mensaje de seguridad para una aplicación que utiliza un certificado autofirmado" (que ya no puede ocultarse permanentemente), solo para confiar en bcprov .
https://www.java.com/en/download/help/appsecuritydialogs.xml
Por lo que sé, esto se debe a que las bibliotecas BC están firmadas con el certificado BouncyCastle, emitido por la "CA de firma de código JCE". Debido a eso, la biblioteca puede actuar y actuar como un proveedor de criptografía.
PERO: el JRE no puede construir la cadena de certificados para confiar en la firma. Muestra "proveedor: DESCONOCIDO"
Sé que puedo eliminar esa firma y firmar por mí mismo (tengo un certificado de firma de código de Thawte):
- funciona con bcpkix lib
- no funciona con bcprov porque no se considerará un proveedor de criptografía válido (no será de confianza para el JRE).
Estoy en lo cierto ¿Que puedo hacer?
PD: Busqué mucho en Google para encontrar el certificado raíz de JCA (para ponerlo en el almacén de confianza de JRE), sin éxito ... ¿Hay alguna forma de obtener esa CA raíz?
Después de una gran cantidad de búsquedas y algunas publicaciones en la lista de correo de BC ... Encontré la solución, así que la suelto aquí para otras personas que puedan enfrentar ese problema:
La solución es básicamente firmar la biblioteca de BC por segunda vez con mi propio certificado.
El JAR necesita la firma JCA para poder ser considerado un proveedor de criptografía, por lo que no lo elimine.
El JAR también necesita (además) una firma de código para poder ejecutarse en la JVM (en la que confía el JRE).
Una última cosa, algo de incompatibilidad ocurrió con la tecnología de firma:
- BC lib se firma usando el algoritmo de digestión SHA1
- jarsigner (en mi computadora) está realizando la firma con el algoritmo de resumen SHA256 de forma predeterminada, lo que conduce a un error de verificación.
- Así que tuve que pedirle al jarsigner que lo hiciera de la manera SHA1. (por alguna razón, ambas firmas tienen que ser consistentes desde ese punto de vista)
Aquí está el parámetro magic del comando jarsigner para agregarlo y hacerlo realidad: -digestalg SHA1
Ejemplo de comando:
jarsigner -keystore ./mykeystore.jks -storepass myPass -digestalg SHA1 bcprov-jdk15on-149.jar myAlias
... ¡y tu estas listo!
La siguiente publicación me dio una sugerencia: ¿Qué impide que Java verifique los frascos firmados con múltiples algoritmos de firma?
También podemos incluir la otra publicación de y la respuesta que me ayudó:
Poniendo la línea: Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider ());
Me ayudó a deshacerme de la excepción.