“Archivo de firma inválido” cuando se intenta ejecutar un .jar

Mi progtwig Java está empaquetado en un archivo jar y hace uso de una biblioteca jar externa, castillo hinchable . Mi código comstack bien, pero ejecutar el jar conduce al siguiente error:

Excepción en el hilo “principal” java.lang.SecurityException: resumen de archivo de firma inválido para los atributos principales de Manifest

Busqué en Google durante más de una hora buscando una explicación y encontré muy poco valor. Si alguien ha visto este error antes y podría ofrecer algo de ayuda, estaría obligado.

La solución que se incluye aquí podría proporcionar un puntero.

Resumen de archivo de firma inválido para los atributos principales de Manifiesto

Línea de fondo :

Probablemente sea mejor mantener el contenedor oficial tal como está y simplemente agregarlo como una dependencia en el archivo de manifiesto para su archivo jar de aplicación.

Para aquellos que usan gradle y tratan de crear y usar un flask gordo, la siguiente syntax podría ayudar.

 jar { doFirst { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' } 

Algunas de sus dependencias probablemente sean archivos jar firmados. Cuando los combina en un gran archivo jar, los archivos de firma correspondientes siguen presentes y ya no coinciden con el archivo jar “combinado grande”, por lo que el tiempo de ejecución se detiene al pensar que el archivo jar ha sido alterado (que … hablar).

Puede resolver el problema eliminando los archivos de firma de las dependencias de archivo jar. Desafortunadamente, no es posible hacerlo en un solo paso en la ant .

Sin embargo, pude hacer que esto funcionara con Ant en dos pasos, sin nombrar específicamente cada dependencia de archivo jar, mediante el uso de:

               

Se supone que el elemento de suspensión evita errores en los archivos con fechas de modificación en el futuro .

Otras variaciones que encontré en los hilos enlazados no funcionaron para mí.

Por favor use el siguiente comando

 zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF' 

Tuve este problema al usar IntelliJ IDEA 14.01.

Pude solucionarlo de la siguiente manera:

Archivo-> Estructura de proyecto-> Agregar nuevo (artefactos) -> jar-> De los módulos con dependencias en la ventana Crear tarro desde módulo:

Seleccione su clase principal

Archivo JAR de bibliotecas Seleccione copiar al directorio de salida y enlace a través de manifiesto

Suponiendo que construya su archivo jar con ant, puede simplemente indicarle a la ant que omita el directorio META-INF. Esta es una versión simplificada de mi objective de ant:

       

La seguridad ya es un tema difícil, pero estoy decepcionado de ver que la solución más popular es eliminar las firmas de seguridad. JCE requiere estas firmas . La sombra Maven explota el archivo jar BouncyCastle que coloca las firmas en META-INF, pero las firmas BouncyCastle no son válidas para un nuevo archivo uber-jar (solo para el contenedor BC), y eso es lo que causa el error de firma no válida en este hilo .

Sí, excluir o eliminar las firmas según lo sugerido por @ruhsuzbaykus hace que desaparezca el error original, pero también puede generar nuevos errores crípticos:

 java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available 

Al especificar explícitamente dónde encontrar el algoritmo de esta manera:

 SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC"); 

Pude obtener un error diferente:

 java.security.NoSuchProviderException: JCE cannot authenticate the provider BC 

JCE no puede autenticar al proveedor porque hemos eliminado las firmas criptográficas al seguir la sugerencia en otro lugar de este mismo hilo .

La solución que encontré fue el complemento de empaquetador ejecutable que utiliza un enfoque jar-in-jar para preservar la firma BouncyCastle en un único archivo ejecutable.

ACTUALIZAR :

Otra forma de hacer esto (¿la forma correcta?) Es usar el firmante de Maven Jar . Esto le permite seguir usando el color Maven sin errores de seguridad. SIN EMBARGO, debe tener un certificado de firma de código (Oracle sugiere buscar “Certificado de firma de código Java”). La configuración de POM se ve así:

  org.apache.maven.plugins maven-shade-plugin 3.1.0   package  shade     org.bouncycastle:*  META-INF/*.SF META-INF/*.DSA META-INF/*.RSA      your.class.here   true      org.apache.maven.plugins maven-jarsigner-plugin 1.4   sign  sign    verify  verify     /path/to/myKeystore myfirstkey 111111 111111   

No, no hay forma de que JCE reconozca un certificado autofirmado, por lo que si necesita preservar los certificados de BouncyCastle, debe usar el plugin jar-in-jar u obtener un certificado JCE.

Compare la carpeta META-INF en el jar nuevo con el jar viejo (antes de agregar nuevas bibliotecas). Es posible que haya nuevos archivos. Si es así, puedes eliminarlos. Debería ayudar. Saludos, 999michal

Error: se ha producido un error de JNI, compruebe su instalación y vuelva a intentarlo Excepción en el hilo “principal” java.lang.SecurityException: resumen de archivo de firmas inválido para los atributos principales de Manifiesto en sun.security.util.SignatureFileVerifier.processImpl (SignatureFileVerifier.java: 314) en sun.security.util.SignatureFileVerifier.process (SignatureFileVerifier.java:268) en java.util.jar.JarVerifier.processEntry (JarVerifier.java:316) en java.util.jar.JarVerifier.update (JarVerifier.java : 228) en java.util.jar.JarFile.initializeVerifier (JarFile.java:383) en java.util.jar.JarFile.getInputStream (JarFile.java:450) en sun.misc.URLClassPath $ JarLoader $ 2.getInputStream (URLClassPath .java: 977) en sun.misc.Resource.cachedInputStream (Resource.java:77) en sun.misc.Resource.getByteBuffer (Resource.java:160) en java.net.URLClassLoader.defineClass (URLClassLoader.java:454) en java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) en java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) en java.net.URLClassLoade r $ 1.run (URLClassLoader.java:362) en java.security.AccessController.doPrivileged (método nativo) en java.net.URLClassLoader.findClass (URLClassLoader.java:361) en java.lang.ClassLoader.loadClass (ClassLoader.java : 424) en sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) en java.lang.ClassLoader.loadClass (ClassLoader.java:357) en sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

Lo que me ayudó (IntelliJ IDEA 2016.3): Archivo -> Estructura del proyecto -> Artefactos -> Agregar JAR -> Seleccionar clase principal -> Elija “copiar al directorio de salida y vincular a través del manifiesto” -> Aceptar -> Aplicar -> Crear – > Construir artefactos … -> Construir

Tuve un problema similar. La razón fue que estaba comstackndo usando un JDK con un JRE diferente al predeterminado en mi cuadro de Windows.

Usar el java.exe correcto resolvió mi problema.

Es posible que dos signatarios diferentes arruinen la mente de Java.

Intente eliminar la carpeta META-INF del contenedor, agregar el manifiesto y volver a firmar el JAR, me ayudó: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- atributos /

Una estrategia consistiría en usar ANT para simplificar la eliminación de la firma de cada archivo Jar. Procedería con los siguientes pasos:

  1. Copiando MANIFEST.MF en un archivo temporal
  2. Eliminar las entradas de Nombre y SHA del archivo temporal
  3. Crear un archivo Jar temporal con el manifiesto temporal
  4. Eliminar el manifiesto temporal
  5. Intercambio del archivo Jar original con el archivo temporal

Aquí hay un macrodef ANT haciendo el trabajo:

                           

`

La definición puede llamarse así en una tarea ANT:

    

Si está obteniendo esto cuando intente enlazar archivos JAR para un proyecto de enlaces Xamarin.Android, haga lo siguiente:

JARTOXML: advertencia J2XA006: se ha producido un error de clase faltante al reflejar com.your.class: resumen de archivo de firma no válido para los atributos principales de Manifest

Simplemente abra los archivos JAR con Winzip y elimine los directorios meta-inf. Reconstruir: trabajo hecho

En caso de que esté usando gradle, aquí hay una tarea completa de farJar:

 version = '1.0' //create a single Jar with all dependencies task fatJar(type: Jar) { manifest { attributes 'Implementation-Title': 'Gradle Jar File Example', 'Implementation-Version': version, 'Main-Class': 'com.example.main' } baseName = project.name + '-all' from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' with jar } 

Recientemente comencé a usar IntelliJ en mis proyectos. Sin embargo, algunos de mis colegas todavía usan Eclipse en los mismos proyectos. Hoy, tengo el mismo error después de ejecutar el archivo jar creado por mi IntelliJ. Mientras que todas las soluciones aquí hablan casi de la misma cosa, ninguna de ellas me funcionó fácilmente (posiblemente porque no uso ANT, la creación de maven me dio otros errores que me remitieron a http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutionException , y tampoco pude averiguar cuáles son los flasks firmados por mí mismo!)

Finalmente, esto me ayudó

 zip -d demoSampler.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF' 

¿Adivina qué se ha eliminado de mi archivo jar?

 deleting: META-INF/ECLIPSE_.SF deleting: META-INF/ECLIPSE_.RSA 

Parece que el problema era relevante para algunos archivos relevantes para eclipse.

Si está buscando una solución Fat JAR sin desempaquetar o alterar las bibliotecas originales, pero con un cargador de clases JAR especial, eche un vistazo a mi proyecto aquí .

Descargo de responsabilidad: No escribí el código, simplemente lo empaqué y lo publiqué en Maven Central y describí en mi página de lectura cómo usarlo.

Personalmente lo uso para crear archivos JAR uber ejecutables que contengan dependencias de BouncyCastle. Quizás sea útil para ti también.