La sicurezza è già un argomento difficile, ma sono deluso nel vedere che la soluzione più popolare è eliminare le firme di sicurezza. JCE richiede queste firme . La tonalità Maven esplode il file jar di BouncyCastle che inserisce le firme in META-INF, ma le firme BouncyCastle non sono valide per un nuovo, uber-jar (solo per il vaso BC), ed è ciò che causa l'errore di firma non valido in questo thread .
Sì, l'esclusione o l'eliminazione delle firme come suggerito da @ruhsuzbaykus fa sì che l'errore originale scompaia, ma può anche portare a nuovi errori criptici:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Specificando esplicitamente dove trovare l'algoritmo in questo modo:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Sono stato in grado di ottenere un errore diverso:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE non può autenticare il provider perché abbiamo eliminato le firme crittografiche seguendo il suggerimento altrove in questo stesso thread .
La soluzione che ho trovato era il plug-in eseguibile packer che utilizza un approccio jar-in-jar per preservare la firma BouncyCastle in un singolo jar eseguibile.
AGGIORNAMENTO :
Un altro modo per farlo (il modo corretto?) È usare il firmatario Maven Jar . Ciò ti consente di continuare a utilizzare Maven shade senza ottenere errori di sicurezza. TUTTAVIA, è necessario disporre di un certificato di firma del codice (Oracle suggerisce di cercare "Certificato di firma del codice Java"). La configurazione POM è simile alla seguente:
<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>
No, non c'è modo di far riconoscere a JCE un certificato autofirmato, quindi se è necessario conservare i certificati BouncyCastle, è necessario utilizzare il plug-in jar-in-jar o ottenere un certificato JCE.