安全性已经是一个棘手的话题,但我很失望地看到最流行的解决方案是删除安全签名。 JCE requires these signatures。 Maven shade 会爆炸 BouncyCastle jar 文件,该文件将签名放入 META-INF,但 BouncyCastle 签名对于新的 uber-jar 无效(仅适用于 BC jar),这就是导致 Invalid signature 错误的原因在这个线程中。
是的,按照@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 无法验证提供者,因为我们删除了加密签名 by following the suggestion elsewhere in this same thread。
我找到的解决方案是 executable packer 插件,它使用 jar-in-jar 方法在单个可执行 jar 中保留 BouncyCastle 签名。
更新:
另一种方法(正确的方法?)是使用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 证书。