A segurança já é um tópico difícil, mas estou desapontado ao ver que a solução mais popular é excluir as assinaturas de segurança. O JCE requer essas assinaturas . A sombra Maven explode o arquivo jar do BouncyCastle que coloca as assinaturas no META-INF, mas as assinaturas do BouncyCastle não são válidas para um novo uber-jar (apenas para o jar BC), e é isso que causa o erro de assinatura inválida neste encadeamento .
Sim, excluir ou excluir as assinaturas, conforme sugerido por @ruhsuzbaykus, faz com que o erro original desapareça, mas também pode levar a novos erros enigmáticos:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Especificando explicitamente onde encontrar o algoritmo como este:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Consegui receber um erro diferente:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
A JCE não pode autenticar o provedor porque excluímos as assinaturas criptográficas seguindo a sugestão em outra parte desse mesmo encadeamento .
A solução que encontrei foi o plug-in empacotador executável que usa uma abordagem jar-in-jar para preservar a assinatura BouncyCastle em um único jar executável.
ATUALIZAR :
Outra maneira de fazer isso (da maneira correta?) É usar o assinante Maven Jar . Isso permite que você continue usando o tom Maven sem obter erros de segurança. No entanto, você deve ter um certificado de assinatura de código (a Oracle sugere procurar por "Certificado de assinatura de código Java"). A configuração do POM é assim:
<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>
Não, não há como fazer com que a JCE reconheça um certificado autoassinado; portanto, se você precisar preservar os certificados BouncyCastle, precisará usar o plug-in jar-in-jar ou obter um certificado JCE.