Bezpieczeństwo to już trudny temat, ale jestem rozczarowany, widząc, że najpopularniejszym rozwiązaniem jest usunięcie sygnatur bezpieczeństwa. JCE wymaga tych podpisów . Odcień Maven wybucha plik jar BouncyCastle, który umieszcza podpisy w META-INF, ale podpisy BouncyCastle nie są ważne dla nowego jar-uber-jar (tylko dla jar BC), i to powoduje błąd nieprawidłowego podpisu w tym wątku .
Tak, wykluczenie lub usunięcie podpisów zgodnie z sugestią @ruhsuzbaykus rzeczywiście powoduje zniknięcie pierwotnego błędu, ale może również prowadzić do nowych, tajemniczych błędów:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Określając wprost, gdzie znaleźć taki algorytm:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Byłem w stanie uzyskać inny błąd:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE nie może uwierzytelnić dostawcy, ponieważ usunęliśmy podpisy kryptograficzne , postępując zgodnie z sugestią w innym miejscu tego samego wątku .
Rozwiązaniem, które znalazłem, była wykonywalna wtyczka pakująca, która wykorzystuje podejście jar-in-jar do zachowania podpisu BouncyCastle w jednym, wykonywalnym jarie .
AKTUALIZACJA :
Innym sposobem na zrobienie tego (poprawny sposób?) Jest użycie sygnatariusza Jar Maven . Dzięki temu możesz nadal korzystać z cienia Maven bez błędów bezpieczeństwa. JEDNAK musisz mieć certyfikat do podpisywania kodu (Oracle sugeruje wyszukiwanie „Java Code Signing Certificate”). Konfiguracja POM wygląda następująco:
<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>
Nie, nie ma sposobu, aby JCE rozpoznała certyfikat z podpisem własnym, więc jeśli chcesz zachować certyfikaty BouncyCastle, musisz albo użyć wtyczki jar-in-jar, albo uzyskać certyfikat JCE.