ความปลอดภัยเป็นหัวข้อที่ยากลำบากอยู่แล้ว แต่ฉันผิดหวังที่เห็นวิธีแก้ปัญหายอดนิยมที่สุดคือการลบลายเซ็นความปลอดภัย JCE ต้องใช้ลายเซ็นเหล่านี้ Maven เฉดสีจะระเบิดไฟล์ jar BouncyCastle ซึ่งใส่ลายเซ็นลงใน META-INF แต่ลายเซ็น BouncyCastle ไม่ถูกต้องสำหรับ uber-jar ใหม่ (สำหรับขวด jar BC เท่านั้น) และนั่นเป็นสาเหตุของข้อผิดพลาดลายเซ็นไม่ถูกต้องในชุดข้อความนี้ .
ใช่การยกเว้นหรือลบลายเซ็นตามที่แนะนำโดย @ruhsuzbaykus ทำให้ข้อผิดพลาดเดิมหายไป แต่มันสามารถนำไปสู่ข้อผิดพลาดใหม่ที่เป็นความลับ:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
โดยการระบุตำแหน่งที่จะค้นหาอัลกอริทึมเช่นนี้อย่างชัดเจน:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
ฉันสามารถรับข้อผิดพลาดอื่น:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE ไม่สามารถตรวจสอบความถูกต้องของผู้ให้บริการได้เนื่องจากเราได้ลบลายเซ็นการเข้ารหัส โดยทำตามคำแนะนำที่อื่นในหัวข้อเดียวกันนี้นี้
วิธีแก้ปัญหาที่ฉันพบคือปลั๊กอินตัวเรียกใช้งานแพ็คเกอร์ที่ใช้วิธี jar-in-jar เพื่อรักษาลายเซ็น BouncyCastleใน jar ที่ทำงานได้แบบเดี่ยว
UPDATE :
วิธีการที่จะทำเช่นนี้ (วิธีที่ถูกต้อง?) ก็คือการใช้Maven Jar ลงนาม วิธีนี้ช่วยให้คุณสามารถใช้งาน Maven shade ได้โดยไม่เกิดข้อผิดพลาดด้านความปลอดภัย อย่างไรก็ตามคุณต้องมีใบรับรองการลงรหัส (Oracle แนะนำให้ค้นหา "ใบรับรองการลงนามรหัส Java") การกำหนดค่า POM มีลักษณะดังนี้:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>org.bouncycastle:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>your.class.here</mainClass>
</transformer>
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>sign</id>
<goals>
<goal>sign</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<keystore>/path/to/myKeystore</keystore>
<alias>myfirstkey</alias>
<storepass>111111</storepass>
<keypass>111111</keypass>
</configuration>
</plugin>
ไม่ไม่มีวิธีที่จะทำให้ JCE จดจำใบรับรองที่ลงนามเองได้ดังนั้นหากคุณต้องการเก็บใบรับรอง BouncyCastle คุณต้องใช้ปลั๊กอิน jar-in-jar หรือขอใบรับรอง JCE