Java SecurityException: informasi penanda tangan tidak cocok

121

Saya menyusun ulang kelas saya seperti biasa, dan tiba-tiba mendapat pesan kesalahan berikut. Mengapa? Bagaimana cara memperbaikinya?

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)
jujur
sumber

Jawaban:

137

Hal ini terjadi ketika kelas yang termasuk dalam paket yang sama dimuat dari file JAR yang berbeda, dan file JAR tersebut memiliki tanda tangan yang ditandatangani dengan sertifikat yang berbeda - atau, mungkin lebih sering, setidaknya satu ditandatangani dan satu atau lebih lainnya tidak (yang mencakup kelas yang dimuat dari direktori karena AFAIK tersebut tidak dapat ditandatangani).

Jadi, pastikan semua JAR (atau setidaknya yang berisi kelas dari paket yang sama) ditandatangani menggunakan sertifikat yang sama, atau hapus tanda tangan dari manifes file JAR dengan paket yang tumpang tindih.

Michael Borgwardt
sumber
Saya menggunakan sertifikat yang sama, tetapi sudah kedaluwarsa, bagaimana cara memperbaruinya?
Frank
34
Bisakah seseorang menjelaskan kepada pemula bagaimana melakukan itu? Saya mulai bekerja dengan java dan musim semi seminggu yang lalu dan saya tersesat.
mghz
Saya menghadapi masalah serupa, tetapi di stoples hibernasi. Guci ini tidak ditandatangani, saya masih menghadapi masalah ini. Mengapa? Silakan merujuk ke stackoverflow.com/questions/24386463/…
pengguna613114
apakah ada proses khusus untuk menandatangani beberapa toples dengan sertifikat yang sama. Saya mencoba menandatangani toples (satu per satu) dengan sertifikat yang sama, tetapi masih mendapat pengecualian berikut: informasi penanda tangan tidak cocok dengan informasi penanda tangan kelas lain dalam paket yang sama
vegeta
@vegeta: maaf, saya tidak benar-benar memiliki pengalaman dengan prosedur penandatanganan.
Michael Borgwardt
45

Cara sederhana untuk mengatasinya adalah dengan mencoba mengubah urutan file jar yang diimpor yang dapat dilakukan dari (Eclipse). Klik kanan pada paket Anda -> Build Path -> Configure build path -> References and Libraries -> Order and Export. Coba ubah urutan toples yang berisi file tanda tangan.

Mohit Phougat
sumber
Saya memiliki file jar yang ditandatangani untuk diuji, menguji file kelas dengan paket yang sama, junit, jre, toples lain. Manakah urutan yang tepat dalam gerhana? Belum yakin saya mencoba semua kombinasi. Tetapi tidak melampaui loader kelas SecurityException
datafiddler
Terima kasih atas solusi ini, saya baru saja mengubah urutan junit5 dan hamcrest-all.jar saya dan sekarang pengujian saya berfungsi lagi :)
Wallnussfolie
41

A.Jika Anda menggunakan maven, cara yang berguna untuk men-debug bentrok jar adalah:

mvn dependency:tree

Misalnya, untuk pengecualian:

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

kami melakukan:

mvn dependency:tree|grep servlet

Outputnya:

[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

menunjukkan bentrok servlet-api 2.5 dan javax.servlet 3.0.0.x.

B. Petunjuk berguna lainnya (bagaimana men-debug pengecualian keamanan dan bagaimana mengecualikan maven deps) ada pada pertanyaan di informasi Penandatangan tidak cocok .

Eugene Gr. Philippov
sumber
Saya menggunakan STS sebagai IDE, saya mengalihkan konsol ke konsol maven dan mencoba menjalankan perintah di atas di sana tetapi tidak ada yang terjadi ... Sepertinya konsol maven di STS / gerhana itu hanya untuk menampilkan output tetapi tidak menerima perintah apa pun. Atau apakah saya salah?
nanosoft
1
nanosoft, Tampaknya pertanyaan Anda terkait dengan STS, jadi Anda dapat membuat pertanyaan tingkat atas baru untuk itu. mvn pasti menerima argumen baris perintah.
Eugene Gr. Philippov
@ EugeneGr.Philippov bagaimana ini terkait? Apa ketergantungan: pohon menunjukkan versi dari toples, yang tidak terkait dengan penanda tangan
Gavriel
@Gavriel Saya tidak menggali banyak, tetapi ketika Anda menyingkirkan konflik, pengecualian tidak terjadi.
Eugene Gr. Philippov
Itu mungkin benar dalam beberapa kasus tetapi tidak di semua. Misalnya artefak berbeda dalam grup com.microsoft.azure tampaknya dikompilasi dari berbagai sumber, jadi beberapa di antaranya bahkan tidak memiliki versi yang sama. Dan dalam banyak kasus, memiliki beberapa versi tidak menghasilkan kesalahan (meskipun plugin penegak memperingatkan atau gagal karenanya)
Gavriel
23

Dalam kasus saya, saya telah menduplikasi versi JAR dari BouncyCastle di jalur perpustakaan saya: S

Cedric Simon
sumber
2
Hal yang sama terjadi pada saya. Menghapus semua stoples BC dan memuat versi yang benar menyelesaikannya.
Broken_Window
1
@Cedric - BouncyCastle yang sama adalah kasus saya
nanosoft
Dalam kasus saya adalah karena spring-cloud inside membutuhkan jdk15on dan saya menggunakan bcprov-jdk16 untuk proyek saya.
Glats
8

Saya memiliki pengecualian serupa:

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

Akar masalah adalah saya menyertakan perpustakaan Hamcrest dua kali. Setelah menggunakan file pom Maven. Dan saya juga menambahkan perpustakaan JUnit 4 (yang juga berisi perpustakaan Hamcrest) ke jalur pembangunan proyek. Saya hanya perlu menghapus JUnit dari jalur build dan semuanya baik-baik saja.

Marvin
sumber
6

Hal ini dapat terjadi dengan proxy yang diinstrumentasi cglib karena CGLIB menggunakan informasi penandatangannya sendiri, bukan informasi penanda tangan kelas target aplikasi.

Jarek Przygódzki
sumber
4
Apa yang dapat kami lakukan jika ini masalahnya?
Leandro
@ Jarek: apa solusinya di sini? bisakah kita menggunakan solusi ini? developer.jboss.org/thread/241718
gaurav
@gaurav Kami berhenti menggunakan toples bertanda tangan. Mereka hanya diperlukan untuk Java Web Start, dan sudah lama ditinggalkan.
Jarek Przygódzki
4
  1. Setelah tanda, akses: dist \ lib
  2. Temukan ekstra .jar
  3. Menggunakan Winrar, Anda mengekstrak opsi folder (ekstrak ke "nama folder")
  4. Akses: META-INF / MANIFEST.MF
  5. Hapus setiap tanda tangan seperti itu:

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

  1. Simpan file
  2. Zip lagi
  3. Renaime ext ke .jar kembali
  4. Sudah
Douglas Tybel
sumber
Saya mengalami beberapa masalah mengikuti saran Anda: stackoverflow.com/questions/33988136/…
Deringkan
2

Jika Anda menjalankannya di Eclipse, periksa toples proyek apa pun yang ditambahkan ke jalur build; atau lakukan control-shift-T dan pindai beberapa toples yang cocok dengan namespace yang sama. Kemudian hapus jar yang berlebihan atau usang dari jalur pembangunan proyek.


sumber
2

Saya mengalami masalah ini dengan Eclipse dan JUnit 5. Solusi saya terinspirasi oleh jawaban sebelumnya oleh user2066936 Ini adalah mengkonfigurasi ulang urutan pustaka impor:

  1. Klik kanan proyek tersebut.
  2. Buka [Java Build Path].
  3. Klik Pesan dan Ekspor.
  4. Kemudian dorong JUNIT ke prioritas atas.
SINAR
sumber
1

Dalam kasus saya itu adalah konflik nama paket. Proyek saat ini dan pustaka referensi yang ditandatangani memiliki satu paket yang sama package.foo.utils. Baru saja mengubah nama paket yang rawan kesalahan proyek saat ini menjadi yang lain.

buzz2buzz
sumber
1

Utas agak terlalu tua tetapi karena saya terjebak cukup lama dalam hal ini, inilah perbaikannya (semoga ini membantu seseorang)

Skenario saya:

Nama paketnya adalah: com.abc.def. Ada 2 file jar yang berisi kelas-kelas dari paket ini, katakanlah jar1 dan jar2, yaitu beberapa kelas ada di jar1 dan yang lainnya di jar2. File jar ini ditandatangani menggunakan keystore yang sama tetapi pada waktu yang berbeda dalam build (yaitu secara terpisah). Itu tampaknya menghasilkan tanda tangan yang berbeda untuk file di jar1 dan jar2.

Saya meletakkan semua file di jar1 dan membangun (dan menandatangani) semuanya bersama-sama. Masalahnya hilang.

PS: Nama paket dan nama file jar hanyalah contoh

mukeshkumar
sumber
1

Jika Anda menambahkan semua toples dari bouncycastle.org (dalam kasus saya dari crypto-159.zip), hapus saja yang untuk JDK yang tidak berlaku untuk Anda. Ada redundansi. Anda mungkin hanya membutuhkan toples "jdk15on".

Bertrand_Szoghy
sumber
Ini persis masalah saya, saya menyebarkan aplikasi BC di server aplikasi yang sudah memiliki versi yang ditandatangani khusus yang sama di folder libs bersama, solusinya adalah menghapusnya dan menggunakan yang lebih baru.
GChiappe
1

Pertanyaan ini telah berlangsung lama tetapi saya ingin menyampaikan sesuatu. Saya telah mengerjakan tantangan proyek Musim Semi dan saya menemukannya di Eclipse IDE. Jika Anda menggunakan Maven atau Gradle untuk Spring Boot Rest API, Anda harus menghapus Junit 4 atau 5 di jalur build dan menyertakan Junit di file build pom.xml atau Gradle Anda. Saya rasa itu juga berlaku untuk file konfigurasi yml.

tksilicon.dll
sumber
0

Ini juga terjadi jika Anda menyertakan satu file dengan nama berbeda atau dari lokasi berbeda dua kali, terutama jika ini adalah dua versi berbeda dari file yang sama.

Tomas Walek
sumber
Saya minta maaf tapi saya tidak mengerti. Jenis file apa? Dalam kasus saya, kesalahannya ada pada kelas org.jboss.security.xacml.jaxb.PoliciesType dan saya yakin itu hanya di jar yang disertakan dengan JBoss EAP 5.2 (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro
0

Saya bisa memperbaikinya.

Akar Penyebab: Ini adalah masalah umum saat menggunakan implementasi Sun JAXB dengan toples bertanda tangan. Pada dasarnya implementasi JAXB mencoba untuk menghindari refleksi dengan membuat kelas untuk mengakses properti secara langsung tanpa menggunakan refleksi. Sayangnya, ini menghasilkan kelas baru ini dalam paket yang sama dengan kelas yang diakses dari mana kesalahan ini berasal.

Resolusi: Tambahkan properti sistem berikut untuk menonaktifkan pengoptimalan JAXB yang tidak kompatibel dengan stoples bertanda: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

Ref: https://access.redhat.com/site/solutions/42149

Leandro
sumber
0

Berdasarkan respons @Mohit Phougat, jika Anda menjalankan Groovy dengan anotasi @Grab, Anda dapat mencoba mengatur ulang anotasi tersebut.

ATorras
sumber
0

ini terjadi pada saya ketika menggunakan JUnit + yakinlah + hamcrest, dalam hal ini, jangan tambahkan junit ke jalur pembangunan, jika Anda memiliki proyek maven, ini menyelesaikan saya, di bawah ini adalah 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
sumber
0

Saya menjalankan JUNIT 5 dan juga mereferensikan jar eksternal Hamcrest. Tetapi Hamcrest juga merupakan bagian dari perpustakaan JUNIT 5 . Jadi, saya harus mengubah urutan file jar Hamecrest eksternal ke atas perpustakaan JUNIT 5 di jalur pembuatan.

masukkan deskripsi gambar di sini

D Saggu
sumber