Java SecurityException: thông tin người ký không khớp


121

Tôi đã biên dịch lại các lớp của mình như bình thường và đột nhiên nhận được thông báo lỗi sau. Tại sao? Làm thế nào tôi có thể sửa chữa nó?

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)

Câu trả lời:


137

Điều này xảy ra khi các lớp thuộc cùng một gói được tải từ các tệp JAR khác nhau và các tệp JAR đó có chữ ký được ký bằng các chứng chỉ khác nhau - hoặc có lẽ thường xuyên hơn, ít nhất một được ký và một hoặc nhiều tệp khác thì không (bao gồm các lớp được tải từ các thư mục vì AFAIK đó không thể được ký).

Vì vậy, hãy đảm bảo rằng tất cả các tệp JAR (hoặc ít nhất là những tệp chứa các lớp từ cùng một gói) được ký bằng cùng một chứng chỉ hoặc xóa các chữ ký khỏi tệp kê khai của tệp JAR có các gói chồng chéo.


Tôi đã sử dụng cùng một chứng chỉ, nhưng nó đã hết hạn, làm thế nào để làm mới nó?
Frank

34
Ai đó có thể giải thích cho người mới làm thế nào để làm điều đó? Tôi đã bắt đầu làm việc với java và spring một tuần trước và tôi bị lạc.
mghz

Tôi đang phải đối mặt với vấn đề tương tự, nhưng nó nằm trong lọ ngủ đông. Những lọ này không được ký, tôi vẫn phải đối mặt với vấn đề này. Tại sao? Vui lòng tham khảo stackoverflow.com/questions/24386463/…
user613114

có quy trình cụ thể nào để ký nhiều lọ với cùng một chứng chỉ không. Tôi đã thử ký các lọ (từng cái một) với cùng một chứng chỉ, nhưng vẫn có ngoại lệ sau: thông tin người ký không khớp với thông tin người ký của các lớp khác trong cùng một gói
Vegeta

@vegeta: xin lỗi, tôi thực sự không có bất kỳ kinh nghiệm nào về thủ tục ký kết.
Michael Borgwardt

45

Một cách đơn giản là chỉ cần thử thay đổi thứ tự của các tệp jar đã nhập của bạn có thể được thực hiện từ (Eclipse). Nhấp chuột phải vào gói của bạn -> Đường dẫn xây dựng -> Định cấu hình đường dẫn xây dựng -> Tài liệu tham khảo và Thư viện -> Đặt hàng và xuất. Hãy thử thay đổi thứ tự các lọ chứa các tệp chữ ký.


Tôi có một tệp jar đã ký để được kiểm tra, kiểm tra các tệp lớp có cùng gói, junit, jre, các lọ khác. Thứ tự nào là thích hợp trong nguyệt thực? Không chắc tôi đã thử tất cả các kết hợp. Nhưng đã không đến ngoài SecurityException lớp loader
datafiddler

Cảm ơn giải pháp này, tôi vừa thay đổi thứ tự của junit5 và hamcrest-all.jar của tôi và bây giờ các thử nghiệm của tôi đang hoạt động trở lại :)
Wallnussfolie

41

A. Nếu bạn sử dụng maven, một cách hữu ích để gỡ lỗi các bình đụng độ là:

mvn dependency:tree

Ví dụ, đối với một ngoại lệ:

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

chúng tôi làm:

mvn dependency:tree|grep servlet

Đầu ra của nó:

[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

hiển thị xung đột servlet-api 2.5 và javax.servlet 3.0.0.x.

B. Các gợi ý hữu ích khác (cách gỡ lỗi ngoại lệ bảo mật và cách loại trừ lỗi maven) ở câu hỏi tại thông tin Người ký không khớp .


Tôi đang sử dụng STS làm IDE, tôi đã chuyển bảng điều khiển sang bảng điều khiển maven và cố gắng chạy lệnh trên ở đó nhưng không có gì xảy ra ... Có vẻ như bảng điều khiển maven trong STS / eclipse nó chỉ để hiển thị đầu ra nhưng không chấp nhận bất kỳ lệnh nào. Hoặc là tôi sai?
nanosoft

1
nanosoft, Có vẻ như câu hỏi của bạn liên quan đến STS, vì vậy bạn có thể tạo một câu hỏi cấp cao nhất mới cho nó. mvn chắc chắn chấp nhận các đối số dòng lệnh.
Eugene Gr. Philippov

@ EugeneGr.Philippov điều này có liên quan như thế nào? Sự phụ thuộc là gì: tree cho thấy là phiên bản của cái lọ, không liên quan đến người ký tên
Gavriel

@Gavriel Tôi không tìm hiểu nhiều, nhưng khi bạn thoát khỏi xung đột, ngoại lệ không xảy ra.
Eugene Gr. Philippov

Điều đó có thể đúng trong một số trường hợp nhưng không phải trong tất cả. Ví dụ: các tạo phẩm khác nhau trong nhóm com.microsoft.azure dường như được biên dịch từ nhiều nguồn, vì vậy một số trong số chúng thậm chí không có cùng một phiên bản. Và trong hầu hết các trường hợp có nhiều phiên bản không tạo ra lỗi (ngay cả khi plugin thực thi cảnh báo hoặc không thành công vì nó)
Gavriel

23

Trong trường hợp của tôi, tôi đã sao chép phiên bản JAR của BouncyCastle trong đường dẫn thư viện của mình: S


2
Điều tương tự cũng xảy ra với tôi. Loại bỏ tất cả các bình BC và tải các phiên bản phù hợp đã giải quyết được nó.
Broken_Window

1
@Cedric - Cùng BouncyCastle là trường hợp đối với tôi
nanosoft

Trong trường hợp của tôi là do spring-cloud bên trong yêu cầu jdk15on và tôi đang sử dụng bcprov-jdk16 cho dự án của mình.
Glats

8

Tôi đã có một ngoại lệ tương tự:

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

Vấn đề gốc rễ là tôi đã đưa vào thư viện Hamcrest hai lần. Sau khi sử dụng tệp Maven pom. Và tôi cũng đã thêm thư viện JUnit 4 (cũng chứa thư viện Hamcrest) vào đường dẫn xây dựng của dự án. Tôi chỉ cần xóa JUnit khỏi đường dẫn xây dựng và mọi thứ đều ổn.


6

Điều này có thể xảy ra với các proxy có công cụ cglib vì CGLIB sử dụng thông tin người ký của chính mình thay vì thông tin người ký của lớp mục tiêu ứng dụng.


4
Chúng ta có thể làm gì nếu rơi vào trường hợp này?
Leandro

@Jarek: giải pháp ở đây sẽ là gì? chúng ta có thể sử dụng giải pháp này? developer.jboss.org/thread/241718
gaurav

@gaurav Chúng tôi đã ngừng sử dụng lọ có chữ ký. Chúng chỉ cần thiết cho Java Web Start, và nó đã bị bỏ rơi từ lâu.
Jarek Przygódzki

4
  1. Sau khi ký, hãy truy cập: dist \ lib
  2. Tìm thêm .jar
  3. Sử dụng Winrar, bạn giải nén cho một thư mục (giải nén thành "tên thư mục")
  4. Truy cập: META-INF / MANIFEST.MF
  5. Xóa từng chữ ký như vậy:

Tên: net / sf / jasperreports / engine / use / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest: q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =

  1. Lưu các tập tin
  2. Zip lại
  3. Renaime ext đến .jar trở lại
  4. Đã sẵn sàng

Tôi đang gặp một số vấn đề theo lời khuyên của bạn: stackoverflow.com/questions/33988136/…
Đổ chuông vào

2

Nếu bạn đang chạy nó trong Eclipse, hãy kiểm tra các lọ của bất kỳ dự án nào được thêm vào đường dẫn xây dựng; hoặc thực hiện control-shift-T và quét nhiều lọ khớp với cùng một không gian tên. Sau đó, loại bỏ các lọ dư thừa hoặc lỗi thời khỏi đường dẫn xây dựng của dự án.


2

Tôi đang gặp sự cố này với Eclipse và JUnit 5. Giải pháp của tôi được lấy cảm hứng từ câu trả lời trước đó của user2066936 Đó là định cấu hình lại thứ tự của các thư viện nhập:

  1. Nhấp chuột phải vào dự án.
  2. Mở [Đường dẫn xây dựng Java].
  3. Nhấp vào Đặt hàng và Xuất.
  4. Sau đó đẩy JUNIT lên ưu tiên trên.

1

Trong trường hợp của tôi, đó là xung đột tên gói. Dự án hiện tại và thư viện tham chiếu đã ký có một gói chung package.foo.utils. Chỉ cần thay đổi tên gói dễ xảy ra lỗi của dự án hiện tại thành một tên khác.


1

Một chủ đề hơi cũ nhưng vì tôi đã bị mắc kẹt trong một thời gian khá dài về vấn đề này, đây là bản sửa lỗi (hy vọng nó sẽ giúp ai đó)

Kịch bản của tôi:

Tên gói là: com.abc.def. Có 2 tệp jar chứa các lớp từ gói này nói rằng jar1 và jar2 tức là một số lớp có trong jar1 và những lớp khác trong jar2. Các tệp jar này được ký bằng cách sử dụng cùng một kho khóa nhưng tại các thời điểm khác nhau trong bản dựng (tức là riêng biệt). Điều đó dường như dẫn đến chữ ký khác nhau cho các tệp trong jar1 và jar2.

Tôi đặt tất cả các tệp trong jar1 và xây dựng (và ký tên) tất cả chúng lại với nhau. Vấn đề biến mất.

Tái bút: Tên gói và tên tệp jar chỉ là ví dụ


1

Nếu bạn đã thêm tất cả các lọ từ bouncycastle.org (trong trường hợp của tôi là từ crypto-159.zip), chỉ cần xóa các lọ cho JDK không áp dụng cho bạn. Có thừa. Bạn có thể chỉ cần các lọ "jdk15on".


Đây chính xác là vấn đề của tôi, tôi đang triển khai ứng dụng BC trong một máy chủ ứng dụng đã có phiên bản được ký tùy chỉnh giống nhau trong thư mục libs được chia sẻ của nó, giải pháp là xóa chúng và sử dụng phiên bản mới hơn.
GChiappe

1

Câu hỏi này đã tồn tại trong một thời gian dài nhưng tôi muốn nói lên điều gì đó. Tôi đã thực hiện một thử thách dự án Spring và tôi đã phát hiện ra điều đó trong Eclipse IDE. Nếu bạn đang sử dụng Maven hoặc Gradle cho các API phục hồi khởi động mùa xuân, bạn phải xóa Junit 4 hoặc 5 trong đường dẫn xây dựng và bao gồm Junit trong tệp xây dựng pom.xml hoặc Gradle của bạn. Tôi đoán điều đó cũng áp dụng cho tệp cấu hình yml.


0

Điều này cũng xảy ra nếu bạn bao gồm một tệp với các tên khác nhau hoặc từ các vị trí khác nhau hai lần, đặc biệt nếu đây là hai phiên bản khác nhau của cùng một tệp.


Tôi xin lỗi nhưng tôi không hiểu. Loại tệp nào? Trong trường hợp của tôi, lỗi xảy ra với lớp org.jboss.security.xacml.jaxb.PoliciesType và tôi chắc chắn rằng nó chỉ nằm trong một jar đi kèm với JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro

0

Tôi có thể sửa chữa nó.

Nguyên nhân gốc: Đây là vấn đề phổ biến khi sử dụng triển khai Sun JAXB với các lọ đã ký. Về cơ bản, việc triển khai JAXB đang cố gắng tránh phản chiếu bằng cách tạo một lớp để truy cập trực tiếp vào các thuộc tính mà không sử dụng phản xạ. Thật không may, nó tạo ra lớp mới này trong cùng một gói với lớp đang được truy cập, đây là nguyên nhân của lỗi này.

Giải pháp: Thêm thuộc tính hệ thống sau để vô hiệu hóa các tối ưu hóa JAXB không tương thích với các lọ đã ký: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

Tham khảo: https://access.redhat.com/site/solutions/42149


0

Dựa trên phản hồi của @Mohit Phougat, nếu bạn đang chạy Groovy với chú thích @Grab, bạn có thể thử sắp xếp lại các chú thích như vậy.


0

điều này đã xảy ra với tôi khi sử dụng JUnit + yên tâm + hamcrest, trong trường hợp này, không thêm junit để xây dựng đường dẫn, nếu bạn có dự án maven, điều này đã giải quyết cho tôi, bên dưới là 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

Tôi đang chạy JUNIT 5 và cũng đang tham khảo jar bên ngoài Hamcrest. Nhưng Hamcrest cũng là một phần của thư viện JUNIT 5 . Vì vậy, tôi phải thay đổi thứ tự của tệp jar Hamecrest bên ngoài lên thư viện JUNIT 5 trong đường dẫn xây dựng.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.