Sicherheit ist bereits ein schwieriges Thema, aber ich bin enttäuscht zu sehen, dass die beliebteste Lösung darin besteht, die Sicherheitssignaturen zu löschen. JCE benötigt diese Signaturen . Maven-Schatten explodiert in der BouncyCastle-JAR-Datei, in der die Signaturen in META-INF abgelegt werden. Die BouncyCastle-Signaturen gelten jedoch nicht für ein neues Uber-JAR (nur für das BC-JAR). Dies führt zu dem ungültigen Signaturfehler in diesem Thread .
Ja, das Ausschließen oder Löschen der von @ruhsuzbaykus vorgeschlagenen Signaturen lässt zwar den ursprünglichen Fehler verschwinden, kann aber auch zu neuen, kryptischen Fehlern führen:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Indem Sie explizit angeben, wo sich der Algorithmus wie folgt befindet:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Ich konnte einen anderen Fehler bekommen:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE kann den Anbieter nicht authentifizieren, da wir die kryptografischen Signaturen gelöscht haben, indem wir dem Vorschlag an anderer Stelle in demselben Thread gefolgt sind .
Die Lösung, die ich gefunden habe, war das ausführbare Packer- Plugin, das einen JAR-in-JAR-Ansatz verwendet, um die BouncyCastle-Signatur in einem einzelnen ausführbaren JAR beizubehalten.
AKTUALISIEREN :
Eine andere Möglichkeit, dies zu tun (die richtige?), Ist die Verwendung des Maven Jar-Unterzeichners . Auf diese Weise können Sie Maven Shadow weiterhin verwenden, ohne Sicherheitsfehler zu erhalten. Sie müssen jedoch über ein Codesignaturzertifikat verfügen (Oracle schlägt vor, nach "Java Code Signing Certificate" zu suchen). Die POM-Konfiguration sieht folgendermaßen aus:
<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>
Nein, es gibt keine Möglichkeit, JCE dazu zu bringen, ein selbstsigniertes Zertifikat zu erkennen. Wenn Sie also die BouncyCastle-Zertifikate aufbewahren müssen, müssen Sie entweder das jar-in-jar-Plugin verwenden oder ein JCE-Zertifikat erwerben.