セキュリティはすでに難しいトピックですが、最も一般的な解決策がセキュリティ署名を削除することであることに私は失望しています。JCEにはこれらの署名が必要です。Mavenシェードは、署名を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証明書を取得する必要があります。