Java SecurityException: les informations du signataire ne correspondent pas

121

J'ai recompilé mes classes comme d'habitude et j'ai soudainement reçu le message d'erreur suivant. Pourquoi? Comment puis-je y remédier?

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)
Franc
la source

Réponses:

137

Cela se produit lorsque des classes appartenant au même package sont chargées à partir de différents fichiers JAR et que ces fichiers JAR ont des signatures signées avec différents certificats - ou, peut-être plus souvent, au moins un est signé et un ou plusieurs autres ne le sont pas (ce qui inclut les classes chargées des répertoires car ces AFAIK ne peuvent pas être signés).

Assurez-vous donc que tous les JAR (ou au moins ceux qui contiennent des classes des mêmes packages) sont signés à l'aide du même certificat, ou supprimez les signatures du manifeste des fichiers JAR avec des packages qui se chevauchent.

Michael Borgwardt
la source
J'ai utilisé le même certificat, mais il a expiré, comment le renouveler?
Frank
34
Quelqu'un peut-il expliquer aux débutants comment faire cela? J'ai commencé à travailler avec Java et Spring il y a une semaine et je suis perdu.
mghz
Je suis confronté à un problème similaire, mais c'est dans des bocaux d'hibernation. Ces pots ne sont pas signés, je suis toujours confronté à ce problème. Pourquoi? Veuillez vous référer à stackoverflow.com/questions/24386463/…
user613114
existe-t-il un processus spécifique pour signer plusieurs jars avec le même certificat. J'ai essayé de signer des jars (un par un) avec le même certificat, mais j'ai quand même l'exception suivante: les informations du signataire ne correspondent pas aux informations du signataire des autres classes du même package
vegeta
@vegeta: désolé, je n'ai pas vraiment d'expérience avec la procédure de signature.
Michael Borgwardt
45

Un moyen simple de contourner ce problème est simplement d'essayer de changer l'ordre de vos fichiers jar importés, ce qui peut être fait depuis (Eclipse). Faites un clic droit sur votre package -> Chemin de construction -> Configurer le chemin de construction -> Références et bibliothèques -> Trier et exporter. Essayez de changer l'ordre des fichiers JAR contenant les fichiers de signature.

Mohit Phougat
la source
J'ai un fichier jar signé à tester, des fichiers de classe de test avec le même package, junit, jre, d'autres fichiers jars. Quel est le bon ordre d'éclipse? Pas sûr que j'aie encore essayé toutes les combinaisons. Mais n'est pas venu au-delà du chargeur de classe SecurityException
datafiddler
Merci pour cette solution, je viens de changer l'ordre de junit5 et de mon hamcrest-all.jar et maintenant mes tests fonctionnent à nouveau :)
Wallnussfolie
41

A. Si vous utilisez maven, un moyen utile de déboguer les fichiers jars en conflit est:

mvn dependency:tree

Par exemple, pour une exception:

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

Nous faisons:

mvn dependency:tree|grep servlet

Sa sortie:

[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

montre des conflits entre servlet-api 2.5 et javax.servlet 3.0.0.x.

B. D'autres conseils utiles (comment déboguer l'exception de sécurité et comment exclure maven deps) se trouvent à la question à l' information du signataire ne correspond pas .

Eugene Gr. Philippov
la source
J'utilise STS comme IDE, j'ai basculé la console sur la console maven et j'ai essayé d'exécuter la commande ci-dessus mais rien ne s'est passé ... Il semble que la console maven dans STS / éclipse juste pour afficher la sortie mais n'accepte aucune commande. Ou ai-je tort?
nanosoft
1
nanosoft, Il semble que votre question soit liée à STS, vous pouvez donc créer une nouvelle question de premier niveau pour elle. mvn accepte à coup sûr les arguments de ligne de commande.
Eugene Gr. Philippov
@ EugeneGr.Philippov comment est-ce lié? Qu'est-ce que la dépendance: l'arbre montre est la version des bocaux, qui n'est pas liée au signataire
Gavriel
@Gavriel Je n'ai pas beaucoup creusé, mais quand on se débarrasse des conflits, l'exception ne se produit pas.
Eugene Gr. Philippov
Cela peut être vrai dans certains cas, mais pas dans tous. Par exemple, différents artefacts du groupe com.microsoft.azure semblent être compilés à partir de plusieurs sources, de sorte que certains d'entre eux n'ont même pas la même version. Et dans la plupart des cas, avoir plusieurs versions ne produit pas l'erreur (même si le plugin enforcer avertit ou échoue à cause de cela)
Gavriel
23

Dans mon cas, j'avais dupliqué la version JAR de BouncyCastle dans le chemin de ma bibliothèque: S

Cédric Simon
la source
2
La même chose m'est arrivée. La suppression de tous les bocaux BC et le chargement des bonnes versions ont résolu le problème.
Broken_Window
1
@Cedric - Même BouncyCastle était le cas pour moi
nanosoft
Dans mon cas, c'était parce que spring-cloud à l'intérieur nécessite jdk15on et que j'utilisais bcprov-jdk16 pour mon projet.
Glats
8

J'ai eu une exception similaire:

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

Le problème principal était que j'ai inclus la bibliothèque Hamcrest deux fois. Une fois en utilisant le fichier pom Maven. Et j'ai également ajouté la bibliothèque JUnit 4 (qui contient également une bibliothèque Hamcrest) au chemin de construction du projet. J'ai simplement dû supprimer JUnit du chemin de construction et tout allait bien.

Marvin
la source
6

Cela peut se produire avec les proxys instrumentés par cglib car CGLIB utilise ses propres informations de signataire au lieu des informations de signataire de la classe cible de l'application.

Jarek Przygódzki
la source
4
Que pouvons-nous faire si tel est le cas?
Leandro
@Jarek: quelle serait la solution ici? pouvons-nous utiliser cette solution? developer.jboss.org/thread/241718
gaurav
@gaurav Nous avons arrêté d'utiliser des pots signés. Ils n'étaient nécessaires que pour Java Web Start, et il a été abandonné depuis longtemps.
Jarek Przygódzki
4
  1. Après le signe, accédez à: dist \ lib
  2. Trouver des fichiers .jar supplémentaires
  3. En utilisant Winrar, vous extrayez pour un dossier (extraire vers "nom du dossier") option
  4. Accès: META-INF / MANIFEST.MF
  5. Supprimez chaque signature comme ça:

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

  1. Enregistrez le fichier
  2. Zip à nouveau
  3. Renaime ext à .jar retour
  4. Déjà
Douglas Tybel
la source
J'ai quelques problèmes en suivant vos conseils: stackoverflow.com/questions/33988136/…
Ring
2

Si vous l'exécutez dans Eclipse, vérifiez les fichiers JAR de tous les projets ajoutés au chemin de construction; ou effectuez control-shift-T et recherchez plusieurs fichiers JAR correspondant au même espace de noms. Supprimez ensuite les fichiers JAR redondants ou obsolètes du chemin de génération du projet.


la source
2

J'ai ce problème avec Eclipse et JUnit 5. Ma solution est inspirée de la réponse précédente de user2066936 Il s'agit de reconfigurer l'ordre des bibliothèques d'import:

  1. Cliquez avec le bouton droit sur le projet.
  2. Ouvrez [Java Build Path].
  3. Cliquez sur Commander et exporter.
  4. Puis poussez JUNIT sur la priorité supérieure.
RAYON
la source
1

Dans mon cas, c'était un conflit de nom de package. Le projet actuel et la bibliothèque référencée signée avaient un package en commun package.foo.utils. Je viens de changer le nom du package sujet aux erreurs du projet actuel par autre chose.

buzz2buzz
la source
1

Un fil un peu trop ancien mais comme je suis resté coincé pendant un certain temps à ce sujet, voici le correctif (j'espère que cela aide quelqu'un)

Mon scénario:

Le nom du package est: com.abc.def. Il y a 2 fichiers jar qui contiennent des classes de ce paquet, disons jar1 et jar2, c'est-à-dire que certaines classes sont présentes dans jar1 et d'autres dans jar2. Ces fichiers jar sont signés en utilisant le même keystore mais à des moments différents dans la construction (c'est-à-dire séparément). Cela semble entraîner une signature différente pour les fichiers dans jar1 et jar2.

J'ai mis tous les fichiers dans jar1 et les ai tous construits (et signés) ensemble. Le problème disparaît.

PS: les noms de packages et les noms de fichiers jar ne sont que des exemples

mukeshkumar
la source
1

Si vous avez ajouté tous les fichiers JAR de bouncycastle.org (dans mon cas de crypto-159.zip), supprimez simplement ceux des JDK qui ne s'appliquent pas à vous. Il y a des licenciements. Vous n'avez probablement besoin que des jars "jdk15on".

Bertrand_Szoghy
la source
C'était exactement mon problème, je déployais une application BC dans un serveur d'applications qui avait déjà une version signée personnalisée de la même chose dans son dossier libs partagé, la solution était de les supprimer et d'utiliser les plus récentes.
GChiappe
1

Cette question dure depuis longtemps mais je veux apporter quelque chose. J'ai travaillé sur un défi de projet Spring et j'ai découvert cela dans Eclipse IDE. Si vous utilisez Maven ou Gradle pour les API Spring Boot Rest, vous devez supprimer Junit 4 ou 5 dans le chemin de construction et inclure Junit dans votre fichier de construction pom.xml ou Gradle. Je suppose que cela s'applique également au fichier de configuration yml.

tksilicon
la source
0

Cela se produit également si vous incluez deux fois un fichier avec des noms différents ou des emplacements différents, surtout s'il s'agit de deux versions différentes du même fichier.

Tomas Walek
la source
Je suis désolé mais je ne comprends pas. Quel genre de fichier? Dans mon cas, l'erreur est avec la classe org.jboss.security.xacml.jaxb.PoliciesType et je suis sûr que ce n'est que dans un bocal fourni avec JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro
0

Je pourrais le réparer.

Cause fondamentale: il s'agit d'un problème courant lors de l'utilisation de l'implémentation Sun JAXB avec des fichiers JAR signés. Essentiellement, l'implémentation JAXB essaie d'éviter la réflexion en générant une classe pour accéder directement aux propriétés sans utiliser la réflexion. Malheureusement, il génère cette nouvelle classe dans le même package que la classe en cours d'accès, d'où provient cette erreur.

Résolution: ajoutez la propriété système suivante pour désactiver les optimisations JAXB qui ne sont pas compatibles avec les fichiers JAR signés: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

Réf: https://access.redhat.com/site/solutions/42149

Leandro
la source
0

Sur la base de la réponse @Mohit Phougat, si vous exécutez un Groovy avec des annotations @Grab, vous pouvez essayer de réorganiser ces annotations.

ATorras
la source
0

cela m'est arrivé lors de l'utilisation de JUnit + soyez assuré + hamcrest, dans ce cas, n'ajoutez pas junit au chemin de construction, si vous avez le projet maven, cela m'a résolu, ci-dessous le 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>
Naveen
la source
0

J'utilisais JUNIT 5 et je faisais également référence au pot externe Hamcrest. Mais Hamcrest fait également partie de la bibliothèque JUNIT 5 . Donc, je dois changer l'ordre du fichier jar Hamecrest externe dans la bibliothèque JUNIT 5 dans le chemin de construction.

entrez la description de l'image ici

D Saggu
la source