Java SecurityException: la información del firmante no coincide


121

Volví a compilar mis clases como de costumbre y, de repente, recibí el siguiente mensaje de error. ¿Por qué? ¿Cómo puedo arreglarlo?

java.lang.SecurityException: class "Chinese_English_Dictionary"'s signer information does not match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(ClassLoader.java:776)

Respuestas:


137

Esto sucede cuando las clases que pertenecen al mismo paquete se cargan desde diferentes archivos JAR, y esos archivos JAR tienen firmas firmadas con diferentes certificados o, quizás más a menudo, al menos uno está firmado y uno o más no lo están (lo que incluye clases cargadas de directorios ya que esos AFAIK no se pueden firmar).

Por lo tanto, asegúrese de que todos los archivos JAR (o al menos los que contienen clases de los mismos paquetes) estén firmados con el mismo certificado o elimine las firmas del manifiesto de los archivos JAR con paquetes superpuestos.


Usé el mismo certificado, pero está vencido, ¿cómo renovarlo?
Frank

34
¿Alguien puede explicar a los novatos cómo se hace? Empecé a trabajar con Java y Spring hace una semana y estoy perdido.
mghz

Estoy enfrentando un problema similar, pero está en frascos de hibernación. Estos frascos no están firmados, todavía me enfrento a este problema. ¿Por qué? Consulte stackoverflow.com/questions/24386463/…
user613114

¿Existe algún proceso específico para firmar varios frascos con el mismo certificado? Intenté firmar frascos (uno por uno) con el mismo certificado, pero aún obtuve la siguiente excepción: la información del firmante no coincide con la información del firmante de otras clases en el mismo paquete
vegeta

@vegeta: lo siento, realmente no tengo ninguna experiencia con el procedimiento de firma.
Michael Borgwardt

45

Una forma simple de evitarlo es simplemente intentar cambiar el orden de sus archivos jar importados, lo que se puede hacer desde (Eclipse). Haga clic derecho en su paquete -> Ruta de compilación -> Configurar ruta de compilación -> Referencias y bibliotecas -> Ordenar y exportar. Intente cambiar el orden de los frascos que contienen archivos de firmas.


Tengo un archivo jar firmado para probar, archivos de clase de prueba con el mismo paquete, junit, jre, otros jar. ¿Cuál es el orden correcto en el eclipse? No estoy seguro de haber probado todas las combinaciones todavía. Pero no vino más allá del cargador de clases SecurityException
datafiddler

Gracias por esta solución, acabo de cambiar el orden de junit5 y mi hamcrest-all.jar y ahora mis pruebas están funcionando de nuevo :)
Wallnussfolie

41

R. Si usa maven, una forma útil de depurar frascos en conflicto es:

mvn dependency:tree

Por ejemplo, para una excepción:

java.lang.SecurityException: class "javax.servlet.HttpConstraintElement"'s signer information does not match signer information of other classes in the same package

hacemos:

mvn dependency:tree|grep servlet

Su salida:

[INFO] +- javax.servlet:servlet-api:jar:2.5:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet.jsp:jar:2.2.0.v201112011158:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:jar:1.2.0.v201105211821:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.0.0.RC2:compile

muestra un conflicto entre servlet-api 2.5 y javax.servlet 3.0.0.x.

B. Otras sugerencias útiles (cómo depurar la excepción de seguridad y cómo excluir deps maven) están en la pregunta en La información del firmante no coincide .


Estoy usando STS como un IDE, cambié la consola a la consola maven e intenté ejecutar el comando anterior allí, pero no pasó nada ... Parece que la consola maven en STS / eclipse solo muestra la salida pero no acepta ningún comando. ¿O me equivoco?
nanosoft

1
nanosoft, parece que su pregunta está relacionada con STS, por lo que podría crear una nueva pregunta de nivel superior para ella. mvn acepta con seguridad argumentos de línea de comandos.
Eugene Gr. Philippov

@ EugeneGr.Philippov ¿cómo se relaciona esto? Lo que muestra la dependencia: árbol es la versión de los frascos, que no está relacionada con el firmante
Gavriel

@Gavriel No investigué mucho, pero cuando te deshaces de los conflictos, la excepción no ocurre.
Eugene Gr. Philippov

Eso podría ser cierto en algunos casos, pero no en todos. Por ejemplo, los diferentes artefactos en el grupo com.microsoft.azure parecen estar compilados a partir de múltiples fuentes, por lo que algunos de ellos ni siquiera tienen la misma versión. Y en la mayoría de los casos, tener varias versiones no produce el error (incluso si el complemento ejecutor advierte o falla debido a él)
Gavriel

23

En mi caso, había duplicado la versión JAR de BouncyCastle en la ruta de mi biblioteca: S


2
Me ha pasado lo mismo. Quitar todos los frascos de BC y cargar las versiones correctas lo resolvió.
Broken_Window

1
@Cedric - Same BouncyCastle fue mi caso
nanosoft

En mi caso fue porque spring-cloud inside requiere jdk15on y estaba usando bcprov-jdk16 para mi proyecto.
Glats

8

Tuve una excepción similar:

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

La raíz del problema fue que incluí la biblioteca de Hamcrest dos veces. Una vez usando el archivo pom de Maven. Y también agregué la biblioteca JUnit 4 (que también contiene una biblioteca Hamcrest) a la ruta de construcción del proyecto. Simplemente tuve que eliminar JUnit de la ruta de compilación y todo estuvo bien.


6

Esto puede ocurrir con los proxies instrumentados por cglib porque CGLIB usa su propia información de firmante en lugar de la información de firmante de la clase de destino de la aplicación.


4
¿Qué podemos hacer si este es el caso?
Leandro

@Jarek: ¿cuál sería la solución aquí? ¿Podemos usar esta solución? developer.jboss.org/thread/241718
gaurav

@gaurav Dejamos de usar frascos firmados. Solo eran necesarios para Java Web Start, y hace tiempo que se abandonó.
Jarek Przygódzki

4
  1. Después de firmar, acceda a: dist \ lib
  2. Encuentra .jar extra
  3. Usando Winrar, extrae para una carpeta (extraer a "nombre de carpeta") opción
  4. Acceso: META-INF / MANIFEST.MF
  5. Elimina cada firma así:

Nombre: net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest: q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =

  1. Guarda el archivo
  2. Zip de nuevo
  3. Renaime ext a .jar volver
  4. Ya

Estoy teniendo algunos problemas después de su consejo: stackoverflow.com/questions/33988136/...
Anillo

2

Si lo está ejecutando en Eclipse, verifique los archivos jar de cualquier proyecto agregado a la ruta de compilación; o haga control-shift-T y busque varios frascos que coincidan con el mismo espacio de nombres. Luego, elimine los frascos redundantes u obsoletos de la ruta de compilación del proyecto.


2

Tengo este problema con Eclipse y JUnit 5. Mi solución está inspirada en la respuesta anterior del user2066936 Es reconfigurar el orden de las bibliotecas de importación:

  1. Haz clic derecho en el proyecto.
  2. Abra [Ruta de compilación de Java].
  3. Haga clic en Solicitar y exportar.
  4. Luego presione JUNIT a la prioridad superior.

1

En mi caso, fue un conflicto de nombre de paquete. El proyecto actual y la biblioteca referenciada firmada tenían un paquete en común package.foo.utils. Acabo de cambiar el nombre del paquete propenso a errores del proyecto actual por otro.


1

Un hilo un poco demasiado antiguo, pero como estuve atascado durante bastante tiempo en esto, aquí está la solución (espero que ayude a alguien)

Mi escenario:

El nombre del paquete es: com.abc.def. Hay 2 archivos jar que contienen clases de este paquete, digamos jar1 y jar2, es decir, algunas clases están presentes en jar1 y otras en jar2. Estos archivos jar se firman utilizando el mismo almacén de claves pero en diferentes momentos de la compilación (es decir, por separado). Eso parece resultar en una firma diferente para los archivos en jar1 y jar2.

Puse todos los archivos en jar1 y los construí (y firmé) todos juntos. El problema desaparece.

PD: los nombres de los paquetes y los nombres de los archivos jar son solo ejemplos


1

Si agregó todos los frascos de bouncycastle.org (en mi caso de crypto-159.zip), simplemente elimine los de los JDK que no se aplican a usted. Hay despidos. Probablemente solo necesite los frascos "jdk15on".


Este era exactamente mi problema, estaba implementando una aplicación BC en un servidor de aplicaciones que ya tenía una versión personalizada firmada de la misma en su carpeta de bibliotecas compartidas, la solución era eliminarlas y usar las más nuevas.
GChiappe

1

Esta pregunta ha durado mucho tiempo, pero quiero aportar algo. He estado trabajando en un desafío del proyecto Spring y lo descubrí en Eclipse IDE. Si está utilizando Maven o Gradle para las API Spring Boot Rest, debe eliminar Junit 4 o 5 en la ruta de compilación e incluir Junit en su archivo de compilación pom.xml o Gradle. Supongo que eso también se aplica al archivo de configuración yml.


0

Esto también sucede si incluye un archivo con diferentes nombres o desde diferentes ubicaciones dos veces, especialmente si se trata de dos versiones diferentes del mismo archivo.


Lo siento pero no entiendo. ¿Qué tipo de archivo? En mi caso, el error es con la clase org.jboss.security.xacml.jaxb.PoliciesType y estoy seguro de que solo está en un jar que viene con JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro

0

Podría arreglarlo.

Causa principal: este es un problema común cuando se utiliza la implementación de Sun JAXB con archivos jar firmados. Esencialmente, la implementación de JAXB está tratando de evitar la reflexión generando una clase para acceder directamente a las propiedades sin usar la reflexión. Desafortunadamente, genera esta nueva clase en el mismo paquete que la clase a la que se accede, de donde proviene este error.

Resolución: agregue la siguiente propiedad del sistema para deshabilitar las optimizaciones JAXB que no son compatibles con los frascos firmados: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

Ref: https://access.redhat.com/site/solutions/42149


0

Según la respuesta de @Mohit Phougat, si está ejecutando un Groovy con anotaciones de @Grab, puede intentar reordenar dichas anotaciones.


0

esto me sucedió cuando usé JUnit + tenga la seguridad + hamcrest, en este caso, no agregue junit para construir la ruta, si tiene el proyecto maven, esto me resolvió, a continuación está el pom.xml

<dependencies>

    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>

    </dependency>


</dependencies>

0

Estaba ejecutando JUNIT 5 y también hacía referencia al tarro externo de Hamcrest. Pero Hamcrest también forma parte de la biblioteca JUNIT 5 . Entonces, tengo que cambiar el orden del archivo jar externo de Hamecrest en la biblioteca JUNIT 5 en la ruta de compilación.

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.