Java SecurityException: Die Unterzeichnerinformationen stimmen nicht überein


121

Ich habe meine Klassen wie gewohnt neu kompiliert und plötzlich die 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)

Antworten:


137

Dies geschieht, wenn Klassen, die zum selben Paket gehören, aus verschiedenen JAR-Dateien geladen werden und diese JAR-Dateien Signaturen haben, die mit unterschiedlichen Zertifikaten signiert sind - oder möglicherweise häufiger mindestens eine signiert ist und eine oder mehrere andere nicht (einschließlich geladener Klassen) aus Verzeichnissen, da diese AFAIK nicht signiert werden können).

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


Ich habe das gleiche Zertifikat verwendet, aber es ist abgelaufen. Wie kann ich es neu erstellen?
Frank

33
Kann jemand Neulingen erklären, wie das geht? Ich habe vor einer Woche angefangen mit Java und Spring zu arbeiten und bin verloren.
mghz

Ich stehe vor einem ähnlichen Problem, aber es befindet sich im Winterschlaf. Diese Gläser sind nicht signiert, dennoch stehe ich vor diesem Problem. Warum? Bitte beziehen Sie sich auf stackoverflow.com/questions/24386463/…
user613114

Gibt es einen bestimmten Prozess zum Signieren mehrerer Gläser mit demselben Zertifikat? Ich habe versucht, Gläser (einzeln) mit demselben Zertifikat zu signieren, habe aber immer noch die folgende Ausnahme erhalten: Die Unterzeichnerinformationen stimmen nicht mit den Unterzeichnerinformationen anderer Klassen im selben Paket überein
vegeta

@vegeta: Entschuldigung, ich habe keine wirkliche Erfahrung mit dem Signierverfahren.
Michael Borgwardt

45

Ein einfacher Weg, dies zu umgehen, besteht darin, die Reihenfolge Ihrer importierten JAR-Dateien zu ändern, was über (Eclipse) möglich ist. Klicken Sie mit der rechten Maustaste auf Ihr Paket -> Erstellungspfad -> Erstellungspfad konfigurieren -> Referenzen und Bibliotheken -> Bestellen und Exportieren. Versuchen Sie, die Reihenfolge der Gläser zu ändern, die Signaturdateien enthalten.


Ich habe eine signierte JAR-Datei zum Testen, Testklassendateien mit dem gleichen Paket, Junit, Jre, andere Jars. Welches ist die richtige Reihenfolge in Eclipse? Ich bin mir nicht sicher, ob ich alle Kombinationen ausprobiert habe. Aber kam nicht über den Klassenlader SecurityException
Datafiddler

Vielen Dank für diese Lösung, ich habe gerade die Reihenfolge von junit5 und meinem hamcrest-all.jar geändert und jetzt funktionieren meine Tests wieder :)
Wallnussfolie

41

A. Wenn Sie maven verwenden, ist eine nützliche Methode zum Debuggen von Kollisionsgläsern:

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 tun:

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) finden Sie bei der Frage unter Signer-Informationen stimmen nicht überein .


Ich verwende STS als IDE. Ich habe die Konsole auf Maven Console umgestellt und versucht, den obigen Befehl auszuführen. Es ist jedoch nichts passiert. Sieht so aus, als ob die Maven-Konsole in STS / Eclipse nur die Ausgabe anzeigt, aber keine Befehle akzeptiert. Oder liege ich falsch?
Nanosoft

1
nanosoft, Ihre Frage scheint STS-bezogen zu sein, sodass Sie eine neue Frage auf oberster Ebene erstellen können. mvn akzeptiert mit Sicherheit Befehlszeilenargumente.
Eugene Gr. Philippov

@ EugeneGr.Philippov wie hängt das zusammen? Was die Abhängigkeit: Baum zeigt, ist die Version der Gläser, die nicht mit dem Unterzeichner verwandt ist
Gavriel

@ Gavriel Ich habe nicht viel gegraben, aber wenn Sie Konflikte loswerden, passiert die Ausnahme nicht.
Eugene Gr. Philippov

Das mag in einigen Fällen zutreffen, aber nicht in allen. Beispielsweise scheinen verschiedene Artefakte in der Gruppe com.microsoft.azure aus mehreren Quellen kompiliert worden zu sein, sodass einige von ihnen nicht einmal dieselbe Version haben. Und in den meisten Fällen führen mehrere Versionen nicht zu dem Fehler (selbst wenn das Enforcer-Plugin warnt oder aufgrund dessen fehlschlägt)
Gavriel

23

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


2
Das gleiche ist mir passiert. Das Entfernen aller BC-Gläser und das Laden der richtigen Versionen löste das Problem.
Broken_Window

1
@ Cedric - Same BouncyCastle war der Fall für mich
Nanosoft

In meinem Fall war, weil Spring-Cloud im Inneren jdk15on erfordert und ich bcprov-jdk16 für mein Projekt verwendet habe.
Glats

8

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 war, dass ich die Hamcrest-Bibliothek zweimal aufgenommen habe. Einmal mit Maven Pom-Datei. Außerdem habe ich die JUnit 4-Bibliothek (die auch eine Hamcrest-Bibliothek enthält) zum Erstellungspfad des Projekts hinzugefügt. Ich musste einfach JUnit aus dem Erstellungspfad entfernen und alles war in Ordnung.


6

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


4
Was können wir tun, wenn dies der Fall ist?
Leandro

@ Jarek: Was wäre die Lösung hier? können wir diese Lösung verwenden? developer.jboss.org/thread/241718
Gaurav

@gaurav Wir haben aufgehört, signierte Gläser zu verwenden. Sie wurden nur für Java Web Start benötigt und sind seit langem aufgegeben worden.
Jarek Przygódzki

4
  1. Nach dem Signieren Zugriff: dist \ lib
  2. Finden Sie zusätzliche .jar
  3. Mit Winrar extrahieren Sie nach einem Ordner (in "Ordnernamen" extrahieren)
  4. Zugriff: META-INF / MANIFEST.MF
  5. Löschen Sie jede Signatur 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. Wieder Reißverschluss
  3. Renaime ext .jar zurück
  4. Bereits

Ich habe einige Probleme, die Ihrem Rat folgen
Ring

2

Wenn Sie es in Eclipse ausführen, überprüfen Sie die Gläser aller Projekte, die dem Erstellungspfad hinzugefügt wurden. oder machen Sie Control-Shift-T und suchen Sie nach mehreren Gläsern, die demselben Namespace entsprechen. Entfernen Sie dann redundante oder veraltete Gläser aus dem Erstellungspfad des Projekts.


2

Ich habe dieses Problem mit Eclipse und JUnit 5. Meine Lösung ist von der vorherigen Antwort von user2066936 inspiriert. Es besteht darin, die Reihenfolge der Importbibliotheken neu zu konfigurieren:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt.
  2. Öffnen Sie [Java Build Path].
  3. Klicken Sie auf Bestellen und Exportieren.
  4. Drücken Sie dann JUNIT auf die obere Priorität.

1

In meinem Fall war es ein Paketnamenkonflikt. Das aktuelle Projekt und die signierte referenzierte Bibliothek hatten ein Paket gemeinsam package.foo.utils. Ändern Sie einfach den aktuellen fehleranfälligen Paketnamen des Projekts in etwas anderes.


1

Ein bisschen zu alter Thread, aber da ich einige Zeit damit beschäftigt war, hier ist die Lösung (hoffe, es hilft jemandem)

Mein Szenario:

Der Paketname lautet: com.abc.def. Es gibt 2 JAR-Dateien, die Klassen aus diesem Paket enthalten, z. B. jar1 und jar2, dh einige Klassen sind in jar1 und andere in jar2 vorhanden. Diese JAR-Dateien werden mit demselben Keystore, jedoch zu unterschiedlichen Zeiten im Build (dh separat) signiert. 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 alle zusammen erstellt (und signiert). Das Problem verschwindet.

PS: Die Paketnamen und JAR-Dateinamen sind nur Beispiele


1

Wenn Sie alle Gläser von bouncycastle.org hinzugefügt haben (in meinem Fall von crypto-159.zip), entfernen Sie einfach diejenigen für die JDKs, die für Sie nicht zutreffen. Es gibt Entlassungen. Sie benötigen wahrscheinlich nur die "jdk15on" -Gläser.


Dies war genau mein Problem. Ich stellte eine BC-Anwendung auf einem Anwendungsserver bereit, dessen freigegebener Bibliotheksordner bereits eine benutzerdefinierte signierte Version derselben enthält. Die Lösung bestand darin, sie zu entfernen und die neueren zu verwenden.
GChiappe

1

Diese Frage hat lange gedauert, aber ich möchte etwas einbringen. Ich habe an einer Spring-Projektherausforderung gearbeitet und dies in Eclipse IDE entdeckt. Wenn Sie Maven oder Gradle für Spring Boot Rest-APIs verwenden, müssen Sie Junit 4 oder 5 im Erstellungspfad entfernen und Junit in Ihre Erstellungsdatei pom.xml oder Gradle aufnehmen. Ich denke, das gilt auch für die yml-Konfigurationsdatei.


0

Dies geschieht auch, wenn Sie eine Datei mit unterschiedlichen Namen oder von unterschiedlichen Speicherorten zweimal einfügen, insbesondere wenn es sich um zwei verschiedene Versionen derselben Datei handelt.


Es tut mir leid, aber ich verstehe nicht. Was für eine Datei? In meinem Fall liegt der Fehler bei der Klasse org.jboss.security.xacml.jaxb.PoliciesType, und ich bin sicher, dass er nur in einem Glas enthalten ist, das mit JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/) geliefert wird. jboss-as / common / lib / jbossxacml.jar)
Leandro

0

Ich könnte es reparieren.

Grundursache: Dies ist ein häufiges Problem bei Verwendung der Sun JAXB-Implementierung mit signierten Jars. Im Wesentlichen versucht die JAXB-Implementierung, Reflexion zu vermeiden, indem eine Klasse generiert wird, die direkt auf die Eigenschaften zugreift, ohne Reflexion zu verwenden. Leider generiert es diese neue Klasse im selben Paket wie die Klasse, auf die zugegriffen wird. Daher kommt dieser Fehler.

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


0

Basierend auf der Antwort von @Mohit Phougat können Sie versuchen, solche Annotationen neu zu ordnen, wenn Sie einen Groovy mit @ Grab-Annotationen ausführen.


0

Dies ist mir bei der Verwendung von JUnit passiert. + Seien Sie versichert + Hamcrest. In diesem Fall fügen Sie Junit nicht hinzu, um den Pfad zu erstellen. Wenn Sie das Maven-Projekt haben, wurde dies von mir behoben. Unten finden Sie die Datei 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

Ich habe JUNIT 5 ausgeführt und auch auf das externe Glas von Hamcrest verwiesen. Hamcrest ist aber auch Teil der JUNIT 5- Bibliothek. Daher muss ich die Reihenfolge der externen Hamecrest-JAR-Datei in der JUNIT 5- Bibliothek im Erstellungspfad ändern .

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.