Bảo mật đã là một chủ đề khó khăn, nhưng tôi thất vọng khi thấy giải pháp phổ biến nhất là xóa chữ ký bảo mật. JCE yêu cầu những chữ ký này . Bóng Maven phát nổ tệp jar BouncyCastle đặt chữ ký vào META-INF, nhưng chữ ký BouncyCastle không hợp lệ đối với một jar mới, chỉ (đối với jar BC) và đó là nguyên nhân gây ra lỗi chữ ký không hợp lệ trong luồng này .
Có, loại trừ hoặc xóa các chữ ký theo đề xuất của @ruhsuzbaykus thực sự làm cho lỗi ban đầu biến mất, nhưng nó cũng có thể dẫn đến các lỗi mới, khó hiểu về mật mã:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Bằng cách chỉ định rõ ràng nơi tìm thuật toán như thế này:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Tôi đã có thể nhận được một lỗi khác nhau:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE không thể xác thực nhà cung cấp vì chúng tôi đã xóa chữ ký điện tử bằng cách làm theo đề xuất ở nơi khác trong cùng chủ đề này .
Giải pháp tôi tìm thấy là plugin đóng gói thực thi sử dụng cách tiếp cận jar-in-jar để giữ chữ ký BouncyCastle trong một jar có thể thực thi được.
CẬP NHẬT :
Một cách khác để làm điều này (cách chính xác?) Là sử dụng người ký Maven Jar . Điều này cho phép bạn tiếp tục sử dụng bóng Maven mà không gặp lỗi bảo mật. TUY NHIÊN, bạn phải có chứng chỉ ký mã (Oracle khuyên bạn nên tìm kiếm "Chứng chỉ ký mã Java"). Cấu hình POM trông như thế này:
<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>
Không, không có cách nào để JCE nhận ra chứng chỉ tự ký, vì vậy nếu bạn cần bảo quản các loại giấy BouncyCastle, bạn phải sử dụng plugin jar-in-jar hoặc lấy chứng chỉ JCE.