Java SecurityException: информация подписавшего не совпадает
Я перекомпилировал свои классы как обычно, и внезапно получил следующее сообщение об ошибке. Зачем? Как я могу это исправить?
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)
19 ответов
Это происходит, когда классы, принадлежащие одному и тому же пакету, загружаются из разных файлов JAR, и эти файлы JAR имеют подписи, подписанные разными сертификатами - или, возможно, чаще, по крайней мере, один подписан, а один или несколько других нет (который включает загруженные классы). из каталогов, так как эти AFAIK не могут быть подписаны).
Поэтому убедитесь, что все JAR-файлы (или, по крайней мере, те, которые содержат классы из одинаковых пакетов) подписаны с использованием одного и того же сертификата, или удалите подписи из манифеста файлов JAR с перекрывающимися пакетами.
Простой способ обойти это - просто попытаться изменить порядок импортированных файлов JAR, что можно сделать из (Eclipse). Щелкните правой кнопкой мыши по вашему пакету -> Путь сборки -> Настроить путь сборки -> Ссылки и библиотеки -> Порядок и экспорт. Попробуйте изменить порядок банок, которые содержат файлы подписи.
О. Если вы используете maven, полезный способ отладки конфликтующих jar-файлов:
mvn dependency:tree
Например, для исключения:
java.lang.SecurityException: class "javax.servlet.HttpConstraintElement"'s signer information does not match signer information of other classes in the same package
мы делаем:
mvn dependency:tree|grep servlet
Его вывод:
[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
показывает конфликтующие сервлет-api 2.5 и javax.servlet 3.0.0.x.
Б. Другие полезные советы (как отладить исключение безопасности и как исключить maven deps) в вопросе у подписавшего информация не совпадает.
В моем случае я дублировал JAR-версию BouncyCastle в моем пути к библиотеке:S
У меня было похожее исключение:
java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
Основная проблема заключалась в том, что я включил библиотеку Hamcrest дважды. Однажды используя Maven POM файл. И я также добавил библиотеку JUnit 4 (которая также содержит библиотеку Hamcrest) к пути сборки проекта. Мне просто пришлось удалить JUnit из пути сборки, и все было хорошо.
Это может происходить с прокси-инструментами cglib, потому что CGLIB использует свою собственную информацию подписавшего вместо информации подписывающего целевого класса приложения.
- После знака, доступ: dist\lib
- Найти дополнительный.jar
- Используя Winrar, вы извлекаете для папки (извлечение в "имя папки") вариант
- Доступ: META-INF/MANIFEST.MF
- Удалить каждую подпись так:
Имя: net/sf/jasperreports/engine/util/xml/JaxenXPathExecuterFactory.c lass SHA-256-Digest: q3B5wW+hLX/+lP2+L0/6wRVXRHq1mISBo1dkixT6Vxc=
- Сохранить файл
- Застегните молнию снова
- Ренайм доб. Назад
- Уже
Слишком старая тема, но так как я застрял на этом некоторое время, вот исправление (надеюсь, это кому-нибудь поможет)
Мой сценарий:
Имя пакета: com.abc.def. Есть 2 файла jar, которые содержат классы из этого пакета, например, jar1 и jar2, т.е. некоторые классы присутствуют в jar1, а другие - в jar2. Эти файлы JAR подписаны с использованием одного и того же хранилища ключей, но в разное время сборки (т. Е. Отдельно). Это, кажется, приводит к другой подписи для файлов в jar1 и jar2.
Я поместил все файлы в jar1 и собрал (и подписал) их все вместе. Проблема уходит.
PS: имена пакетов и имена файлов JAR являются только примерами
У меня проблема с Eclipse и JUnit 5. Мое решение основано на предыдущем ответе user2066936. Это изменение порядка библиотек импорта:
- Щелкните проект правой кнопкой мыши.
- Откройте [Путь сборки Java].
- Щелкните "Заказ и экспорт".
- Затем установите JUNIT на более высокий приоритет.
Если вы запускаете его в Eclipse, проверьте файлы jar всех проектов, добавленных в путь сборки; или сделайте control-shift-T и сканируйте несколько jar-файлов, соответствующих одному и тому же пространству имен. Затем удалите избыточные или устаревшие файлы JAR из пути сборки проекта.
В моем случае это был конфликт имени пакета. Текущий проект и подписанная ссылочная библиотека имели один общий пакет package.foo.utils
, Просто изменил имя текущего подверженного ошибкам пакета пакета на что-то другое.
Если вы добавили все jar-файлы с bouncycastle.org (в моем случае с crypto-159.zip), просто удалите те файлы JDK, которые к вам не относятся. Есть увольнения. Вам, вероятно, нужны только банки jdk15on.
Этот вопрос длился давно, но я хочу кое-что сказать. Я работал над проблемой проекта Spring и обнаружил это в Eclipse IDE. Если вы используете Maven или Gradle для API Spring Boot Rest, вам необходимо удалить Junit 4 или 5 в пути сборки и включить Junit в свой файл сборки pom.xml или Gradle. Думаю, это относится и к конфигурационному файлу yml.
Я мог бы это исправить.
Основная причина: это распространенная проблема при использовании реализации Sun JAXB с подписанными банками. По сути, реализация JAXB пытается избежать отражения, генерируя класс для прямого доступа к свойствам без использования отражения. К сожалению, он генерирует этот новый класс в том же пакете, что и класс, к которому осуществляется доступ, откуда и происходит эта ошибка.
Решение. Добавьте следующее системное свойство, чтобы отключить оптимизации JAXB, несовместимые с подписанными файлами jar: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
Это также происходит, если вы включаете один файл с разными именами или из разных мест дважды, особенно если это две разные версии одного и того же файла.
Исходя из ответа @Mohit Phougat, если вы используете Groovy с аннотациями @Grab, вы можете попытаться изменить порядок таких аннотаций.
Я запускал JUNIT 5 и также ссылался на внешнюю банку Hamcrest. Но Hamcrest также является частью библиотеки JUNIT 5. Итак, мне нужно изменить порядок внешнего файла jar Hamecrest в библиотеке JUNIT 5 в пути сборки.
Это случилось со мной при использовании JUnit + rest assured + hamcrest, в этом случае не добавляйте junit в путь сборки, если у вас есть проект maven, это разрешило меня, ниже 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>
Я получал аналогичную ошибку при попытке использовать Mockito:
"$$FastClassByMockitoWithCGLIB$$abb8f5a0"'s signer information does not match signer information of other classes in the same package"
Я использовал старую версию Mockito, и обновление до последней версии Mockito решило эту проблему. Проблема заключалась в CGLIB, как упоминалось в одном из других ответов. В более новых версиях Mockito заменяет CGLIB на ByteBuddy, и проблема решается. Мне также пришлось добавить новые банки ByteBuddy в путь к классам в Eclipse, чтобы Mockito снова заработал.