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 ที่มีแพ็กเกจทับซ้อนกัน


ฉันใช้ใบรับรองเดิม แต่หมดอายุแล้วจะรีใหม่ได้อย่างไร
แฟรงค์

34
มีใครสามารถอธิบายให้มือใหม่เข้าใจได้บ้างว่าต้องทำอย่างไร ฉันเริ่มทำงานกับ java และ spring เมื่อสัปดาห์ที่แล้วและฉันก็หลงทาง
mghz

ฉันกำลังเผชิญกับปัญหาที่คล้ายกัน แต่มันอยู่ในขวดไฮเบอร์เนต ขวดเหล่านี้ไม่ได้ลงนามฉันยังคงประสบปัญหานี้ ทำไม? โปรดดูที่stackoverflow.com/questions/24386463/…
user613114

มีกระบวนการเฉพาะในการลงนามหลายไหด้วยใบรับรองเดียวกันหรือไม่ ฉันพยายามเซ็นชื่อขวด (ทีละใบ) ด้วยใบรับรองเดียวกัน แต่ยังคงได้รับข้อยกเว้นดังต่อไปนี้: ข้อมูลผู้ลงนามไม่ตรงกับข้อมูลผู้ลงนามของชั้นเรียนอื่นในแพ็คเกจเดียวกัน
vegeta

@vegeta: ขออภัยฉันไม่มีประสบการณ์เกี่ยวกับขั้นตอนการลงนามเลย
Michael Borgwardt

45

วิธีง่ายๆก็คือลองเปลี่ยนลำดับของไฟล์ jar ที่นำเข้าซึ่งสามารถทำได้จาก (Eclipse) คลิกขวาที่แพ็คเกจของคุณ -> Build Path -> Configure build path -> References and Libraries -> Order and Export ลองเปลี่ยนลำดับของขวดโหลที่มีไฟล์ลายเซ็น


ฉันมีไฟล์ jar ที่เซ็นชื่อที่จะทดสอบทดสอบไฟล์คลาสด้วยแพ็คเกจเดียวกัน junit, jre, jar อื่น ๆ ลำดับที่เหมาะสมในคราสคืออะไร? ไม่แน่ใจว่าฉันลองชุดทั้งหมดแล้ว แต่ไม่ได้มาเกินตัวโหลดคลาส SecurityException
datafiddler

ขอบคุณสำหรับวิธีแก้ปัญหานี้ฉันเพิ่งเปลี่ยนลำดับของ junit5 และ hamcrest-all.jar ของฉันและตอนนี้การทดสอบของฉันใช้งานได้อีกครั้ง :)
Wallnussfolie

41

ตอบหากคุณใช้ maven วิธีที่มีประโยชน์ในการดีบัก clashing jars คือ:

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

คำแนะนำที่มีประโยชน์อื่น ๆ บี (วิธีการแก้ปัญหาข้อยกเว้นการรักษาความปลอดภัยและวิธีการที่จะไม่รวม deps Maven) อยู่ที่คำถามที่ข้อมูลผู้เซ็นชื่อไม่ตรงกับ


ฉันใช้ STS เป็น IDE ฉันเปลี่ยนคอนโซลเป็นคอนโซล maven และพยายามเรียกใช้คำสั่งด้านบนที่นั่น แต่ไม่มีอะไรเกิดขึ้น ... ดูเหมือนว่าคอนโซล maven ใน STS / eclipse จะแสดงเอาต์พุต แต่ไม่ยอมรับคำสั่งใด ๆ หรือว่าฉันผิด?
nanosoft

1
nanosoft ดูเหมือนว่าคำถามของคุณเกี่ยวข้องกับ STS ดังนั้นคุณสามารถสร้างคำถามระดับบนสุดใหม่ได้ mvn แน่นอนว่ายอมรับอาร์กิวเมนต์บรรทัดคำสั่ง
ยูจีน Gr. Philippov

@ EugeneGr.Philippov เรื่องนี้เกี่ยวข้องกันอย่างไร? สิ่งที่พึ่งพา: ต้นไม้แสดงให้เห็นว่าเป็นรุ่นของไหซึ่งไม่เกี่ยวข้องกับผู้ลงนาม
Gavriel

@Gavriel ฉันไม่ได้ขุดมาก แต่เมื่อคุณกำจัดความขัดแย้งข้อยกเว้นจะไม่เกิดขึ้น
ยูจีน Gr. Philippov

นั่นอาจเป็นจริงในบางกรณี แต่ไม่ใช่ทั้งหมด ตัวอย่างเช่นสิ่งประดิษฐ์ที่แตกต่างกันในกลุ่ม com.microsoft.azure ดูเหมือนว่าจะรวบรวมจากหลายแหล่งดังนั้นบางส่วนจึงไม่มีเวอร์ชันเดียวกัน และในกรณีส่วนใหญ่การมีหลายเวอร์ชันจะไม่ก่อให้เกิดข้อผิดพลาด (แม้ว่าปลั๊กอินผู้บังคับใช้จะเตือนหรือล้มเหลวก็ตาม)
Gavriel

23

ในกรณีของฉันฉันมี BouncyCastle เวอร์ชัน JAR ซ้ำในเส้นทางไลบรารีของฉัน: S


2
เช่นเดียวกันกับฉัน การลบขวด BC ทั้งหมดและการโหลดเวอร์ชันที่ถูกต้องจะแก้ไขได้
Broken_Window

1
@Cedric - BouncyCastle เดียวกันเป็นกรณีของฉัน
nanosoft

ในกรณีของฉันเป็นเพราะภายในสปริงคลาวด์ต้องการ 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. Zip อีกครั้ง
  3. Renaime ขยายเป็น. jar back
  4. แล้ว

ฉันมีปัญหาตามคำแนะนำของคุณstackoverflow.com/questions/33988136/…
Ring

2

หากคุณกำลังเรียกใช้ใน Eclipse ให้ตรวจสอบไหของโปรเจ็กต์ใด ๆ ที่เพิ่มเข้าไปในเส้นทางการสร้าง หรือทำการ control-shift-T และสแกนหาหลาย ๆ ขวดที่ตรงกับเนมสเปซเดียวกัน จากนั้นลบไหที่ซ้ำซ้อนหรือล้าสมัยออกจากเส้นทางการสร้างของโปรเจ็กต์


2

ฉันมีปัญหากับ Eclipse และ JUnit 5 วิธีแก้ปัญหาของฉันได้รับแรงบันดาลใจจากคำตอบก่อนหน้าโดย user2066936 มันคือการกำหนดค่าลำดับของไลบรารีนำเข้าใหม่:

  1. คลิกขวาที่โครงการ
  2. เปิด [Java Build Path]
  3. คลิกสั่งซื้อและส่งออก
  4. จากนั้นกด JUNIT ไปที่ลำดับความสำคัญสูงสุด

1

ในกรณีของฉันมันเป็นความขัดแย้งของชื่อแพ็กเกจ package.foo.utilsโครงการปัจจุบันและลงนามห้องสมุดอ้างอิงมีแพคเกจหนึ่งในการร่วมกัน เพิ่งเปลี่ยนชื่อแพ็กเกจข้อผิดพลาดของโปรเจ็กต์ปัจจุบันเป็นอย่างอื่น


1

กระทู้เก่าเกินไป แต่เนื่องจากฉันติดอยู่กับเรื่องนี้มาระยะหนึ่งแล้วนี่คือการแก้ไข (หวังว่ามันจะช่วยใครบางคน)

สถานการณ์ของฉัน:

ชื่อแพ็กเกจคือ com.abc.def มีไฟล์ jar 2 ไฟล์ซึ่งมีคลาสจากแพ็คเกจนี้กล่าวว่า jar1 และ jar2 เช่นบางคลาสอยู่ใน jar1 และอื่น ๆ ใน jar2 ไฟล์ jar เหล่านี้ถูกลงนามโดยใช้ที่เก็บคีย์เดียวกัน แต่ในเวลาที่ต่างกันในบิลด์ (เช่นแยกต่างหาก) ดูเหมือนว่าจะส่งผลให้เป็นลายเซ็นที่แตกต่างกันสำหรับไฟล์ใน jar1 และ jar2

ฉันใส่ไฟล์ทั้งหมดใน jar1 และสร้าง (และเซ็นชื่อ) ไว้ด้วยกัน ปัญหาจะหมดไป

PS: ชื่อแพ็กเกจและชื่อไฟล์ jar เป็นเพียงตัวอย่างเท่านั้น


1

หากคุณเพิ่มไหทั้งหมดจาก bouncycastle.org (ในกรณีของฉันจาก crypto-159.zip) เพียงแค่ลบขวดสำหรับ JDK ที่ไม่เกี่ยวข้องกับคุณ มีความซ้ำซ้อน คุณอาจต้องใช้กระปุก "jdk15on" เท่านั้น


นี่เป็นปัญหาของฉันฉันกำลังปรับใช้แอปพลิเคชัน BC ในแอปพลิเคชันเซิร์ฟเวอร์ที่มีเวอร์ชันที่ลงนามแบบกำหนดเองในโฟลเดอร์ libs ที่ใช้ร่วมกันอยู่แล้ววิธีแก้ปัญหาคือลบออกและใช้เวอร์ชันใหม่กว่า
GChiappe

1

คำถามนี้มีมานานแล้ว แต่ฉันต้องการเสนอบางสิ่งบางอย่าง ฉันได้ทำงานกับความท้าทายของโครงการ Spring และฉันค้นพบสิ่งนั้นใน Eclipse IDE หากคุณใช้ Maven หรือ Gradle สำหรับ Spring Boot Rest APIs คุณต้องลบ Junit 4 หรือ 5 ในเส้นทางการสร้างและรวม Junit ไว้ในไฟล์สร้าง pom.xml หรือ Gradle ของคุณ ฉันเดาว่าใช้กับไฟล์คอนฟิกูเรชัน yml ด้วย


0

นอกจากนี้ยังเกิดขึ้นหากคุณรวมไฟล์หนึ่งไฟล์ที่มีชื่อต่างกันหรือจากตำแหน่งที่ต่างกันสองครั้งโดยเฉพาะอย่างยิ่งหากไฟล์เหล่านี้เป็นไฟล์เดียวกันสองเวอร์ชัน


ฉันขอโทษ แต่ฉันไม่เข้าใจ ไฟล์แบบไหน? ในกรณีของฉันข้อผิดพลาดเกิดขึ้นกับคลาส org.jboss.security.xacml.jaxb.PoliciesType และฉันแน่ใจว่ามันอยู่ใน jar ที่มาพร้อมกับ JBoss EAP 5.2 เท่านั้น (/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro

0

ฉันสามารถแก้ไขได้

สาเหตุหลัก: นี่เป็นปัญหาทั่วไปเมื่อใช้การติดตั้ง Sun JAXB กับไหที่ลงนาม โดยพื้นฐานแล้วการใช้งาน JAXB พยายามหลีกเลี่ยงการสะท้อนกลับโดยการสร้างคลาสเพื่อเข้าถึงคุณสมบัติโดยตรงโดยไม่ต้องใช้การสะท้อน น่าเสียดายที่สร้างคลาสใหม่นี้ในแพ็กเกจเดียวกับคลาสที่เข้าถึงซึ่งเป็นที่มาของข้อผิดพลาดนี้

ความละเอียด: เพิ่มคุณสมบัติระบบต่อไปนี้เพื่อปิดใช้งานการปรับแต่ง JAXB ที่เข้ากันไม่ได้กับ jars ที่ลงนาม: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

อ้างอิง: https://access.redhat.com/site/solutions/42149


0

จากการตอบกลับของ @Mohit Phougat หากคุณใช้งาน Groovy ที่มีคำอธิบายประกอบ @Grab คุณสามารถลองเรียงลำดับคำอธิบายประกอบดังกล่าวใหม่ได้


0

สิ่งนี้เกิดขึ้นกับฉันเมื่อใช้ 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>

0

ฉันใช้งานJUNIT 5และกำลังอ้างถึงโถภายนอกของ Hamcrest แต่ Hamcrest ยังเป็นส่วนหนึ่งของห้องสมุดJUNIT 5 ดังนั้นฉันต้องเปลี่ยนลำดับของไฟล์ jar Hamecrest ภายนอกเป็นไลบรารีJUNIT 5ในเส้นทางการสร้าง

ใส่คำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.