Безпека - це вже жорстка тема, але я розчарований, коли найпопулярнішим рішенням є видалення підписів безпеки. СКВ вимагає цих підписів . Тінь Maven вибухає файл jar-файлу BouncyCastle, який підписує підписи в META-INF, але підписи BouncyCastle не дійсні для нового, uber-jar (лише для банку jar BC), і саме це спричиняє помилку підпису в цьому потоці. .
Так, виключення або видалення підписів, як запропонував @ruhsuzbaykus, справді усуває оригінальну помилку, але це також може призвести до нових криптованих помилок:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Чітко вказавши, де знайти такий алгоритм:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Я зміг отримати іншу помилку:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE не може автентифікувати постачальника, оскільки ми видалили криптографічні підписи , дотримуючись пропозиції в іншому потоці .
Я знайшов рішення - плагін, що виконувався, який використовує підхід jar-in-jar для збереження підпису BouncyCastle в одній виконуваній банці.
ОНОВЛЕННЯ :
Ще один спосіб зробити це (правильний спосіб?) - використовувати підписник Maven Jar . Це дозволяє продовжувати використовувати відтінок Maven, не отримуючи помилок безпеки. ЗАРАЗ, у вас повинен бути сертифікат підписання коду (Oracle пропонує шукати "Сертифікат підпису Java-коду"). Конфігурація POM виглядає так:
<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>
Ні, немає ніякого способу змусити JCE розпізнати самопідписаний cert, тому, якщо вам потрібно зберегти серти BouncyCastle, вам доведеться або використовувати плагін jar-in-jar, або отримати cert JCE.