Java SecurityException: Unterzeichnerinformationen stimmen nicht überein

Ich habe meine classn wie gewöhnlich neu kompiliert und plötzlich folgende Fehlermeldung erhalten. Warum? Wie kann ich es reparieren?

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) 

Dies geschieht, wenn classn desselben Pakets aus verschiedenen JAR-Dateien geladen werden und diese JAR-Dateien signierte Signaturen mit unterschiedlichen Zertifikaten haben – oder häufiger mindestens eines signiert ist und eines oder mehrere andere nicht (einschließlich der geladenen classn) aus Verzeichnissen, da diese AFAIK nicht signiert werden können).

Stellen Sie also sicher, dass alle JARs (oder zumindest diejenigen, die classn aus denselben Paketen enthalten) mit demselben Zertifikat signiert sind, oder entfernen Sie die Signaturen aus dem Manifest der JAR-Dateien mit überlappenden Paketen.

Umgehen Sie einfach die Reihenfolge der importierten JAR-Dateien (Eclipse). Rechtsklicken Sie auf Ihr Paket -> Build Path -> Build-Pfad konfigurieren -> Referenzen und Bibliotheken -> Bestellung und Export. Versuchen Sie, die Reihenfolge der Gläser zu ändern, die Signaturdateien enthalten.

A. Wenn Sie Maven verwenden, ist eine nützliche Methode zum Debuggen kollidierender Gläser:

 mvn dependency:tree 

Zum Beispiel für eine Ausnahme:

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

wir machen:

 mvn dependency:tree|grep servlet 

Seine Ausgabe:

 [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 

zeigt kollidierende Servlet-API 2.5 und javax.servlet 3.0.0.x.

B. Andere nützliche Hinweise (wie man die Sicherheitsausnahme debuggt und wie man maven deps ausschließt) sind bei der Frage an Signer Informationen nicht übereinstimmend .

In meinem Fall hatte ich die JAR-Version von BouncyCastle in meinem Bibliothekspfad dupliziert: S

Dies kann bei den cglib-instrumentierten Proxys auftreten, da CGLIB seine eigenen Unterzeichnerinformationen anstelle der Unterzeichnerinformationen der Anwendungszielklasse verwendet.

Ich hatte eine ähnliche Ausnahme:

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

Das Hauptproblem bestand darin, dass ich die Hamcrest-Bibliothek zweimal einfügte. Einmal mit Maven Pom-Datei. Und ich habe auch die JUnit 4-Bibliothek (die auch eine Hamcrest-Bibliothek enthält) zum Build-Pfad des Projekts hinzugefügt. Ich musste einfach JUnit aus dem Build-Pfad entfernen und alles war in Ordnung.

  1. Nach dem Zeichen, Zugriff: dist \ lib
  2. Finde extra .jar
  3. Mit Winrar extrahieren Sie für einen Ordner (Extrahieren zu “Ordnername”) -Option
  4. Zugang: META-INF / MANIFEST.MF
  5. Löschen Sie jede Unterschrift wie folgt:

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

  1. Speicher die Datei
  2. Zip erneut
  3. Renaime ext zu .jar zurück
  4. Bereits

Wenn Sie es in Eclipse ausführen, überprüfen Sie die JAR-Dateien aller Projekte, die dem Erstellungspfad hinzugefügt wurden. Oder führe control-shift-T aus und scanne nach mehreren Gläsern, die den gleichen Namensraum enthalten. Entfernen Sie anschließend redundante oder veraltete JAR-Dateien aus dem Build-Pfad des Projekts.

In meinem Fall war es ein Paketnamenkonflikt. Das aktuelle Projekt und die signierte referenzierte Bibliothek package.foo.utils ein Paket im allgemeinen package.foo.utils . Habe gerade den errorshaften Paketnamen des aktuellen Projekts in etwas anderes geändert.

Dies ist auch der Fall, wenn Sie eine Datei mit unterschiedlichen Namen oder von verschiedenen Speicherorten zweimal einschließen, insbesondere wenn es sich um zwei verschiedene Versionen derselben Datei handelt.

Ich könnte es reparieren.

Grundursache: Dies ist ein häufiges Problem bei der Verwendung der Sun JAXB-Implementierung mit signierten JAR-Dateien. Im Wesentlichen versucht die JAXB-Implementierung, eine reflection zu vermeiden, indem eine class erzeugt wird, die direkt auf die Eigenschaften zugreift, ohne eine reflection zu verwenden. Unglücklicherweise erzeugt es diese neue class im selben Paket wie die class, auf die zugegriffen wird, wo dieser Fehler herkommt.

Lösung: Fügen Sie die folgende Systemeigenschaft hinzu, um die JAXB-Optimierungen zu deaktivieren, die nicht mit signierten Gläsern kompatibel sind: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

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

Wenn Sie eine Groovy mit @Grab-Annotationen ausführen, könnten Sie basierend auf der @Mohit Phougat-Antwort versuchen, solche Annotationen neu zu ordnen.

Ein bisschen zu alter Thread, aber da ich seit geraumer Zeit hier feststeckt, hier ist der Fix (hoffe es hilft jemandem)

Mein Szenario:

Der Paketname lautet: com.abc.def. Es gibt 2 Jar-Dateien, die classn aus diesem Paket enthalten, nämlich jar1 und jar2, dh einige classn sind in jar1 und andere in jar2 vorhanden. Diese JAR-Dateien werden mit demselben Schlüsselspeicher signiert, aber zu unterschiedlichen Zeiten im Build (dh separat). Dies scheint zu einer unterschiedlichen Signatur für die Dateien in jar1 und jar2 zu führen.

Ich habe alle Dateien in jar1 abgelegt und sie alle zusammen gebaut (und signiert). Das Problem verschwindet.

PS: Die Paketnamen und JAR-Dateinamen sind nur Beispiele

Wenn Sie all die Jars von bouncycastle.org (in meinem Fall von crypto-159.zip) hinzugefügt haben, entfernen Sie einfach diejenigen für die JDKs, die nicht auf Sie zutreffen. Es gibt Redundanzen. Sie brauchen wahrscheinlich nur die “jdk15on” -Gläser.