[java] 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)



답변

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

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


답변

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


답변

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 의 질문에 있습니다.


답변

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


답변

비슷한 예외가 있습니다.

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 계측 프록시에서 발생할 수 있습니다.


답변

  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. 이미