La sécurité est déjà un sujet difficile, mais je suis déçu de voir que la solution la plus populaire consiste à supprimer les signatures de sécurité. JCE requiert ces signatures . L'ombre Maven explose le fichier de pot BouncyCastle qui place les signatures dans META-INF, mais les signatures BouncyCastle ne sont pas valides pour un nouveau pot uber (uniquement pour le pot BC), et c'est ce qui provoque l'erreur de signature non valide dans ce fil .
Oui, l'exclusion ou la suppression des signatures comme suggéré par @ruhsuzbaykus fait en effet disparaître l'erreur d'origine, mais elle peut également conduire à de nouvelles erreurs cryptiques:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
En spécifiant explicitement où trouver l'algorithme comme ceci:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
J'ai pu obtenir une erreur différente:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE ne peut pas authentifier le fournisseur car nous avons supprimé les signatures cryptographiques en suivant la suggestion ailleurs dans ce même fil .
La solution que j'ai trouvée était le plugin packer exécutable qui utilise une approche jar-in-jar pour préserver la signature BouncyCastle dans un seul pot exécutable.
MISE À JOUR :
Une autre façon de le faire (la bonne façon?) Est d'utiliser le signataire Maven Jar . Cela vous permet de continuer à utiliser l'ombre Maven sans obtenir d'erreurs de sécurité. CEPENDANT, vous devez avoir un certificat de signature de code (Oracle suggère de rechercher "Certificat de signature de code Java"). La configuration POM ressemble à ceci:
<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>
Non, il n'y a aucun moyen pour que JCE reconnaisse un certificat auto-signé, donc si vous devez conserver les certificats BouncyCastle, vous devez soit utiliser le plugin jar-in-jar, soit obtenir un certificat JCE.