보안은 이미 어려운 주제이지만 가장 인기있는 솔루션은 보안 서명을 삭제하는 것입니다. 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 서명자 를 사용하는 것 입니다. 이를 통해 보안 오류없이 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 인증서를 가져와야합니다.