Java SecurityException : 서명자 정보가 일치하지 않습니다.


121

평소처럼 수업을 다시 컴파일했는데 갑자기 다음과 같은 오류 메시지가 나타납니다. 왜? 어떻게 고칠 수 있습니까?

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)

답변:


137

이것은 동일한 패키지에 속하는 클래스가 다른 JAR 파일에서로드되고 해당 JAR 파일에 다른 인증서로 서명 된 서명이 있거나 더 자주, 적어도 하나는 서명되고 하나 이상의 다른 것은 서명되지 않은 경우 (로드 된 클래스 포함) 해당 AFAIK에 서명 할 수 없기 때문에 디렉터리에서).

따라서 모든 JAR (또는 최소한 동일한 패키지의 클래스를 포함하는 JAR)이 동일한 인증서를 사용하여 서명되었는지 확인하거나 패키지가 겹치는 JAR 파일의 매니페스트에서 서명을 제거하십시오.


동일한 인증서를 사용했는데 만료되었습니다. 갱신하는 방법은 무엇입니까?
Frank

34
누군가 초보자에게 그 방법을 설명 할 수 있습니까? 나는 일주일 전에 자바와 봄으로 일하기 시작했고 길을 잃었습니다.
mghz mar

나는 비슷한 문제에 직면하고 있지만 최대 절전 모드 항아리에 있습니다. 이 항아리는 서명되지 않았지만 여전히이 문제에 직면 해 있습니다. 왜? stackoverflow.com/questions/24386463/…을
user613114 2014-06-25

동일한 인증서로 여러 항아리에 서명하는 특정 프로세스가 있습니까? 동일한 인증서로 jars (하나씩) 서명을 시도했지만 여전히 다음 예외가 발생했습니다. 서명자 정보가 동일한 패키지에있는 다른 클래스의 서명자 정보와 일치하지 않습니다
vegeta

@vegeta : 죄송합니다. 서명 절차에 대한 경험이 없습니다.
Michael Borgwardt

45

간단한 방법은 (Eclipse)에서 수행 할 수있는 가져온 jar 파일의 순서를 변경하는 것입니다. 패키지-> 빌드 경로-> 빌드 경로 구성-> 참조 및 라이브러리-> 주문 및 내보내기를 마우스 오른쪽 단추로 클릭하십시오. 서명 파일이 포함 된 jar의 순서를 변경해보십시오.


테스트 할 서명 된 jar 파일, 동일한 패키지, junit, jre, 다른 jar가있는 테스트 클래스 파일이 있습니다. 이클립스에서 적절한 순서는 무엇입니까? 아직 모든 조합을 시도했는지 확실하지 않습니다. 그러나 클래스 로더 SecurityException가 넘어 오지 않았다
datafiddler

이 솔루션에 감사드립니다. 방금 junit5와 hamcrest-all.jar의 순서를 변경했으며 이제 테스트가 다시 작동합니다. :)
Wallnussfolie

41

A. 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

충돌하는 servlet-api 2.5 및 javax.servlet 3.0.0.x를 보여줍니다.

B. 다른 유용한 힌트 (보안 예외를 디버그하는 방법 및 maven deps를 제외하는 방법)는 Signer information does not match 의 질문에 있습니다.


STS를 IDE로 사용하고 있으며 콘솔을 maven 콘솔로 전환하고 위의 명령을 실행하려고 시도했지만 아무 일도 일어나지 않았습니다. STS / eclipse에서 Maven 콘솔이 출력을 표시하지만 명령을 받아들이지 않습니다. 아니면 내가 틀렸나 요?
nanosoft

1
nanosoft, 귀하의 질문은 STS와 관련된 것으로 보이므로 새로운 최상위 질문을 만들 수 있습니다. mvn은 확실히 명령 줄 인수를 허용합니다.
Eugene Gr. Philippov

@ EugeneGr.Philippov는 어떻게 관련되어 있습니까? dependency : tree가 보여주는 것은 서명자와 관련이없는 jar 버전입니다
Gavriel

@Gavriel 나는 많이 파지 않았지만 갈등을 제거하면 예외가 발생하지 않습니다.
Eugene Gr. Philippov

어떤 경우에는 사실 일 수 있지만 전부는 아닙니다. 예를 들어 com.microsoft.azure 그룹의 서로 다른 아티팩트는 여러 소스에서 컴파일 된 것처럼 보이므로 일부는 동일한 버전을 갖지 않습니다. 그리고 대부분의 경우 여러 버전이있는 경우 오류가 발생하지 않습니다 (이로 인해 집행자 플러그인이 경고하거나 실패하더라도)
Gavriel

23

제 경우에는 라이브러리 경로에 BouncyCastle의 JAR 버전을 복제했습니다.


2
나에게도 같은 일이 일어났다. BC jar를 모두 제거하고 올바른 버전을로드하면 문제가 해결되었습니다.
Broken_Window 2015

1
@Cedric - 동일 BouncyCastle 나를 위해 사건이었다
nanosoft

제 경우에는 spring-cloud 내부에 jdk15on이 필요하고 프로젝트에 bcprov-jdk16을 사용했기 때문입니다.
Glats

8

비슷한 예외가 있습니다.

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을 제거하기 만하면 모든 것이 정상입니다.


6

이는 CGLIB가 애플리케이션 대상 클래스의 서명자 정보 대신 자신의 서명자 정보를 사용하기 때문에 cglib 계측 프록시에서 발생할 수 있습니다.


4
이 경우 어떻게해야합니까?
Leandro

@Jarek : 여기서 해결책은 무엇입니까? 이 솔루션을 사용할 수 있습니까? developer.jboss.org/thread/241718
gaurav

@gaurav 서명 된 항아리 사용을 중단했습니다. Java Web Start에만 필요했으며 오랫동안 버려졌습니다.
Jarek Przygódzki

4
  1. 서명 후 액세스 : dist \ lib
  2. 여분의 .jar 찾기
  3. Winrar를 사용하여 폴더를 추출합니다 ( "폴더 이름"으로 추출) 옵션
  4. 액세스 : META-INF / MANIFEST.MF
  5. 다음과 같이 각 서명을 삭제하십시오.

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

  1. 파일 저장
  2. 다시 압축
  3. Renaime ext to .jar back
  4. 이미

귀하의 조언에 따라 몇 가지 문제가 있습니다. stackoverflow.com/questions/33988136/…
Ring

2

Eclipse에서 실행하는 경우 빌드 경로에 추가 된 프로젝트의 jar를 확인하십시오. 또는 control-shift-T를 수행하고 동일한 네임 스페이스와 일치하는 여러 jar를 검색합니다. 그런 다음 프로젝트의 빌드 경로에서 중복되거나 오래된 jar를 제거합니다.


2

Eclipse 및 JUnit 5에서이 문제가 있습니다. 내 솔루션은 user2066936의 이전 답변에서 영감을 얻었습니다. 가져 오기 라이브러리의 순서를 재구성하는 것입니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. [Java Build Path]를 엽니 다.
  3. 주문 및 내보내기를 클릭합니다.
  4. 그런 다음 JUNIT를 최우선 순위로 푸시합니다.

1

제 경우에는 패키지 이름 충돌이었습니다. 현재 프로젝트와 서명 된 참조 라이브러리에는 공통된 패키지가 하나 package.foo.utils있습니다. 현재 프로젝트에서 오류가 발생하기 쉬운 패키지 이름을 다른 이름으로 변경했습니다.


1

너무 오래된 스레드이지만 이것에 대해 꽤 오랫동안 붙어 있었기 때문에 여기에 수정 사항이 있습니다 (누군가에게 도움이되기를 바랍니다)

내 시나리오 :

패키지 이름은 com.abc.def입니다. 이 패키지의 클래스를 포함하는 2 개의 jar 파일 (예 : jar1 및 jar2)이 있습니다. 즉 일부 클래스는 jar1에 있고 다른 클래스는 jar2에 있습니다. 이러한 jar 파일은 동일한 키 저장소를 사용하여 서명되지만 빌드에서 다른 시간에 (즉, 개별적으로) 서명됩니다. 이는 jar1 및 jar2의 파일에 대해 다른 서명을 초래하는 것 같습니다.

모든 파일을 jar1에 넣고 모두 함께 빌드 (및 서명)했습니다. 문제는 사라집니다.

추신 : 패키지 이름과 jar 파일 이름은 예제 일뿐입니다.


1

bouncycastle.org (내 경우에는 crypto-159.zip)에서 모든 항아리를 추가 한 경우 적용되지 않는 JDK 용 항아리 만 제거하십시오. 중복이 있습니다. "jdk15on"항아리 만 필요합니다.


이것은 정확히 내 문제였습니다. 공유 libs 폴더에 이미 사용자 지정 서명 된 버전이있는 응용 프로그램 서버에 BC 응용 프로그램을 배포하고 있었는데 해결책은이를 제거하고 최신 버전을 사용하는 것이 었습니다.
GChiappe

1

이 질문은 오랫동안 지속되었지만 나는 무언가를 던지고 싶다. 저는 Spring 프로젝트 챌린지에서 일하고 있었고 Eclipse IDE에서 그것을 발견했습니다. Spring Boot Rest API에 Maven 또는 Gradle을 사용하는 경우 빌드 경로에서 Junit 4 또는 5를 제거하고 pom.xml 또는 Gradle 빌드 파일에 Junit을 포함해야합니다. yml 구성 파일에도 적용되는 것 같습니다.


0

이름이 다른 파일 하나 또는 위치가 다른 파일을 두 번 포함하는 경우에도 마찬가지입니다. 특히 같은 파일의 두 가지 버전이 다른 경우에 더욱 그렇습니다.


미안하지만 이해가 안 돼요. 어떤 종류의 파일? 필자의 경우 오류는 org.jboss.security.xacml.jaxb.PoliciesType 클래스에 있으며 JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ 제이 보스 AS / 일반 / lib 디렉토리 / jbossxacml.jar)
레안드로

0

내가 고칠 수 있습니다.

근본 원인 : 이는 서명 된 jar와 함께 Sun JAXB 구현을 사용할 때 발생하는 일반적인 문제입니다. 기본적으로 JAXB 구현은 리플렉션을 사용하지 않고 속성에 직접 액세스하는 클래스를 생성하여 리플렉션을 피하려고합니다. 불행히도,이 오류가 발생하는 액세스되는 클래스와 동일한 패키지에서이 새 클래스를 생성합니다.

해결 방법 : 서명 된 jar와 호환되지 않는 JAXB 최적화를 비활성화하려면 다음 시스템 속성을 추가하십시오. -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

참고 : https://access.redhat.com/site/solutions/42149


0

@Mohit Phougat 응답을 기반으로 @Grab 주석으로 Groovy를 실행하는 경우 이러한 주석을 다시 정렬 할 수 있습니다.


0

이것은 JUnit + rest assured + hamcrest를 사용할 때 나에게 일어났습니다.이 경우 빌드 경로에 junit을 추가하지 마십시오.

<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

JUNIT 5를 실행 중이 었고 Hamcrest 외부 항아리도 참조했습니다. 그러나 Hamcrest는 JUNIT 5 라이브러리의 일부이기도 합니다. 그래서 빌드 경로에서 JUNIT 5 라이브러리 의 외부 Hamecrest jar 파일 순서를 변경해야 합니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.