Java SecurityException: le informazioni sul firmatario non corrispondono


121

Ho ricompilato le mie classi come al solito e improvvisamente ho ricevuto il seguente messaggio di errore. Perché? Come posso ripararlo?

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)

Risposte:


137

Ciò accade quando classi appartenenti allo stesso pacchetto vengono caricate da file JAR diversi e quei file JAR hanno firme firmate con certificati diversi o, forse più spesso, almeno una è firmata e una o più altre no (il che include le classi caricate dalle directory poiché quelle AFAIK non possono essere firmate).

Quindi assicurati che tutti i JAR (o almeno quelli che contengono classi degli stessi pacchetti) siano firmati utilizzando lo stesso certificato, oppure rimuovi le firme dal manifest dei file JAR con pacchetti sovrapposti.


Ho usato lo stesso certificato, ma è scaduto, come rinnovarlo?
Frank

34
Qualcuno può spiegare ai neofiti come farlo? Ho iniziato a lavorare con Java e Spring una settimana fa e mi sono perso.
mghz

Sto affrontando un problema simile, ma è in barattoli di ibernazione. Questi vasi non sono firmati, devo ancora affrontare questo problema. Perché? Si prega di fare riferimento al stackoverflow.com/questions/24386463/...
user613114

esiste un processo specifico per firmare più vasi con lo stesso certificato. Ho provato a firmare i jar (uno per uno) con lo stesso certificato, ma ho comunque ottenuto la seguente eccezione: le informazioni sul firmatario non corrispondono alle informazioni sul firmatario di altre classi nello stesso pacchetto
vegeta

@vegeta: scusa, non ho alcuna esperienza con la procedura di firma.
Michael Borgwardt

45

Un modo semplice per aggirare il problema è provare a cambiare l'ordine dei file jar importati che può essere fatto da (Eclipse). Fare clic con il pulsante destro del mouse sul pacchetto -> Percorso di compilazione -> Configura percorso di compilazione -> Riferimenti e librerie -> Ordina ed esporta. Prova a cambiare l'ordine dei barattoli che contengono i file delle firme.


Ho un file jar firmato da testare, file di classe di test con lo stesso pacchetto, junit, jre, altri jars. Qual è l'ordine corretto in Eclipse? Non sono sicuro di aver provato ancora tutte le combinazioni. Ma non è andato oltre il programma di caricamento classi SecurityException
datafiddler

Grazie per questa soluzione, ho appena cambiato l'ordine di junit5 e del mio hamcrest-all.jar e ora i miei test stanno funzionando di nuovo :)
Wallnussfolie

41

R. Se usi Maven, un modo utile per eseguire il debug di jar in conflitto è:

mvn dependency:tree

Ad esempio, per un'eccezione:

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

noi facciamo:

mvn dependency:tree|grep servlet

La sua uscita:

[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

mostra lo scontro tra servlet-api 2.5 e javax.servlet 3.0.0.x.

B. Altri suggerimenti utili (come eseguire il debug dell'eccezione di sicurezza e come escludere i dipartimenti esperti) sono alla domanda su Le informazioni sul firmatario non corrispondono .


Sto usando STS come IDE, ho cambiato la console in maven console e ho provato a eseguire il comando sopra ma non è successo niente ... Sembra che la console Maven in STS / eclipse solo per visualizzare l'output ma non accetta alcun comando. O mi sbaglio?
nanosoft

1
nanosoft, sembra che la tua domanda sia correlata a STS, quindi potresti creare una nuova domanda di primo livello per essa. mvn di sicuro accetta gli argomenti della riga di comando.
Eugene Gr. Philippov

@ EugeneGr.Philippov come è correlato? What the dependency: tree shows is the version of the jars, that's not related to the signer
Gavriel

@Gavriel Non ho scavato molto, ma quando ti sbarazzi dei conflitti, l'eccezione non accade.
Eugene Gr. Philippov

Potrebbe essere vero in alcuni casi ma non in tutti. Ad esempio, diversi artefatti nel gruppo com.microsoft.azure sembrano essere compilati da più origini, quindi alcuni di essi non hanno nemmeno la stessa versione. E nella maggior parte dei casi avere più versioni non produce l'errore (anche se il plug-in di enforcer avvisa o fallisce a causa di ciò)
Gavriel

23

Nel mio caso, avevo duplicato la versione JAR di BouncyCastle nel mio percorso della libreria: S


2
Lo stesso è accaduto a me. Rimuovendo tutti i barattoli BC e caricando le versioni giuste, il problema è stato risolto.
Broken_Window

1
@Cedric - Lo stesso BouncyCastle era il caso per me
nanosoft

Nel mio caso era perché la nuvola di primavera all'interno richiede jdk15on e stavo usando bcprov-jdk16 per il mio progetto.
Glats

8

Ho avuto un'eccezione simile:

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

Il problema principale era che ho incluso due volte la libreria Hamcrest. Una volta utilizzato il file pom Maven. E ho anche aggiunto la libreria JUnit 4 (che contiene anche una libreria Hamcrest) al percorso di compilazione del progetto. Ho semplicemente dovuto rimuovere JUnit dal percorso di compilazione e tutto è andato bene.


6

Ciò può verificarsi con i proxy con strumentazione cglib perché CGLIB utilizza le proprie informazioni sul firmatario anziché le informazioni sul firmatario della classe di destinazione dell'applicazione.


4
Cosa possiamo fare se è così?
Leandro

@ Jarek: quale sarebbe la soluzione qui? possiamo usare questa soluzione? developer.jboss.org/thread/241718
gaurav

@gaurav Abbiamo smesso di usare barattoli firmati. Erano necessari solo per Java Web Start ed è stato a lungo abbandonato.
Jarek Przygódzki

4
  1. Dopo la firma, accedere a: dist \ lib
  2. Trova .jar extra
  3. Utilizzando Winrar, estrai per una cartella (estrai in "nome cartella")
  4. Accesso: META-INF / MANIFEST.MF
  5. Elimina ogni firma in questo modo:

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

  1. Salva il file
  2. Zip di nuovo
  3. Renaime ext a .jar indietro
  4. Già

Ho dei problemi a seguire il tuo consiglio: stackoverflow.com/questions/33988136/…
Suona il

2

Se lo stai eseguendo in Eclipse, controlla i jar di tutti i progetti aggiunti al percorso di compilazione; oppure fai control-shift-T e cerca più barattoli corrispondenti allo stesso spazio dei nomi. Quindi rimuovere i jar ridondanti o obsoleti dal percorso di compilazione del progetto.


2

Sto riscontrando questo problema con Eclipse e JUnit 5. La mia soluzione è ispirata alla precedente risposta di user2066936 Si tratta di riconfigurare l'ordine delle librerie di importazione:

  1. Fare clic con il pulsante destro del mouse sul progetto.
  2. Apri [Java Build Path].
  3. Fare clic su Ordina ed esporta.
  4. Quindi spingere JUNIT alla priorità superiore.

1

Nel mio caso è stato un conflitto di nomi di pacchetto. Il progetto corrente e la libreria di riferimento firmata avevano un pacchetto in comune package.foo.utils. Ho appena cambiato il nome del pacchetto soggetto a errori del progetto corrente in qualcos'altro.


1

Thread un po 'troppo vecchio ma dato che sono rimasto bloccato per un po' di tempo su questo, ecco la soluzione (spero che aiuti qualcuno)

Il mio scenario:

Il nome del pacchetto è: com.abc.def. Ci sono 2 file jar che contengono classi di questo pacchetto, diciamo jar1 e jar2, cioè alcune classi sono presenti in jar1 e altre in jar2. Questi file jar vengono firmati utilizzando lo stesso keystore ma in momenti diversi nella compilazione (cioè separatamente). Ciò sembra risultare in una firma diversa per i file in jar1 e jar2.

Ho messo tutti i file in jar1 e li ho costruiti (e firmati) tutti insieme. Il problema scompare.

PS: i nomi dei pacchetti e dei file jar sono solo esempi


1

Se hai aggiunto tutti i jar da bouncycastle.org (nel mio caso da crypto-159.zip), rimuovi solo quelli per i JDK che non si applicano a te. Ci sono licenziamenti. Probabilmente ti servono solo i barattoli "jdk15on".


Questo era esattamente il mio problema, stavo distribuendo un'applicazione BC in un server delle applicazioni che aveva già una versione firmata personalizzata della stessa nella sua cartella libs condivisa, la soluzione era rimuoverli e utilizzare quelli più recenti.
GChiappe

1

Questa domanda dura da molto tempo ma voglio inserire qualcosa. Ho lavorato a una sfida del progetto Spring e l'ho scoperto in Eclipse IDE. Se stai usando Maven o Gradle per le API Spring Boot Rest, devi rimuovere Junit 4 o 5 nel percorso di build e includere Junit nel tuo file di build pom.xml o Gradle. Immagino che si applichi anche al file di configurazione yml.


0

Ciò accade anche se includi due volte un file con nomi diversi o da posizioni diverse, soprattutto se si tratta di due versioni diverse dello stesso file.


Mi dispiace ma non capisco. Che tipo di file? Nel mio caso l'errore è con la classe org.jboss.security.xacml.jaxb.PoliciesType e sono sicuro che è solo in un jar fornito con JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro

0

Potrei aggiustarlo.

Causa principale: questo è un problema comune quando si utilizza l'implementazione Sun JAXB con i jar firmati. Essenzialmente l'implementazione JAXB sta cercando di evitare la riflessione generando una classe per accedere direttamente alle proprietà senza usare la riflessione. Sfortunatamente, genera questa nuova classe nello stesso pacchetto della classe a cui si accede, da cui proviene l'errore.

Risoluzione: aggiungere la seguente proprietà di sistema per disabilitare le ottimizzazioni JAXB che non sono compatibili con i jar firmati: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

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


0

In base alla risposta di @Mohit Phougat, se stai eseguendo un Groovy con annotazioni @Grab, potresti provare a riordinare tali annotazioni.


0

questo è successo a me quando si utilizza JUnit + state tranquilli + hamcrest, in questo caso, non aggiungere junit al percorso di build, se avete il progetto maven, questo mi ha risolto, di seguito è il 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

Stavo eseguendo JUNIT 5 e facevo riferimento anche al jar esterno di Hamcrest. Ma Hamcrest fa anche parte della libreria JUNIT 5 . Quindi, devo cambiare l'ordine del file jar Hamecrest esterno nella libreria JUNIT 5 nel percorso di compilazione.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.