セキュリティはすでに難しいトピックですが、最も一般的な解決策がセキュリティ署名を削除することであることに失望しています。JCE はこれらの署名を必要とします。Maven shade は署名を META-INF に入れる BouncyCastle jar ファイルを展開しますが、BouncyCastle 署名は新しい uber-jar (BC jar のみ) に対して有効ではなく、それがこのスレッドで無効な署名エラーの原因です.
はい、@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 署名を単一の実行可能 jarに保存する実行可能パッカープラグインでした。
更新:
これを行う別の方法 (正しい方法?) は、Maven Jar signerを使用することです。これにより、セキュリティ エラーが発生することなく 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 に自己署名証明書を認識させる方法はありません。そのため、BouncyCastle 証明書を保持する必要がある場合は、jar-in-jar プラグインを使用するか、JCE 証明書を取得する必要があります。