Keamanan sudah menjadi topik yang sulit, tetapi saya kecewa melihat solusi paling populer adalah menghapus tanda tangan keamanan. JCE membutuhkan tanda tangan ini . Naungan naungan meledak file jar BouncyCastle yang menempatkan tanda tangan ke META-INF, tetapi tanda tangan BouncyCastle tidak berlaku untuk jar, uber-jar baru (hanya untuk tabung BC), dan itulah yang menyebabkan kesalahan tanda tangan tidak valid di utas ini. .
Ya, mengecualikan atau menghapus tanda tangan seperti yang disarankan oleh @ruhsuzbaykus memang membuat kesalahan asli hilang, tetapi juga dapat menyebabkan kesalahan baru dan samar:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Dengan secara eksplisit menentukan di mana menemukan algoritma seperti ini:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Saya bisa mendapatkan kesalahan yang berbeda:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE tidak dapat mengautentikasi penyedia karena kami telah menghapus tanda tangan kriptografi dengan mengikuti saran di tempat lain di utas yang sama ini .
Solusi yang saya temukan adalah plugin packer yang dapat dieksekusi yang menggunakan pendekatan toples-to-jar untuk mempertahankan tanda tangan BouncyCastle dalam satu stoples yang dapat dieksekusi.
PEMBARUAN :
Cara lain untuk melakukan ini (cara yang benar?) Adalah dengan menggunakan penanda Maven Jar . Ini memungkinkan Anda untuk tetap menggunakan naungan Maven tanpa mendapatkan kesalahan keamanan. NAMUN, Anda harus memiliki sertifikat penandatanganan kode (Oracle menyarankan untuk mencari "Java Signing Certificate"). Konfigurasi POM terlihat seperti ini:
<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>
Tidak, tidak ada cara untuk membuat JCE mengenali sertifikat yang ditandatangani sendiri, jadi jika Anda perlu mempertahankan sertifikat BouncyCastle, Anda harus menggunakan plugin jar-in-jar atau mendapatkan sertifikat JCE.