Güvenlik zaten zor bir konudur, ancak en popüler çözümün güvenlik imzalarını silmek olduğunu hayal kırıklığına uğrattım. JCE bu imzaları gerektirir . Maven gölgesi, imzaları META-INF'ye yerleştiren BouncyCastle jar dosyasını patlıyor, ancak BouncyCastle imzaları yeni bir uber-jar (yalnızca BC jar için) için geçerli değil ve bu iş parçacığında Geçersiz imza hatasına neden olan şey bu .
Evet, @ruhsuzbaykus tarafından önerilen imzaları hariç tutmak veya silmek, orijinal hatayı ortadan kaldırır, ancak yeni, şifreli hatalara da yol açabilir:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
Algoritmayı nerede bulacağınızı açıkça belirterek:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
Farklı bir hata alabildim:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE, aynı iş parçacığının başka bir yerindeki öneriyi izleyerek şifreleme imzalarını sildiğimiz için sağlayıcıyı doğrulayamıyor .
Bulduğum çözüm , BouncyCastle imzasını tek bir yürütülebilir kavanozda korumak için bir kavanoz içinde kavanoz yaklaşımı kullanan yürütülebilir packer eklentisidir .
GÜNCELLEME :
Bunu yapmanın bir başka yolu (doğru yol?) Maven Jar imzalayıcısını kullanmaktır . Bu, güvenlik hataları almadan Maven gölgesini kullanmaya devam etmenizi sağlar. ANCAK, bir kod imzalama sertifikanız olması gerekir (Oracle "Java Kod İmzalama Sertifikası" için arama yapmanızı önerir). POM yapılandırması şöyle görünür:
<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>
Hayır, JCE'nin kendinden imzalı bir sertifikayı tanımasını sağlamanın bir yolu yoktur, bu nedenle BouncyCastle sertifikalarını korumanız gerekiyorsa, jar-in-jar eklentisini kullanmanız veya bir JCE sertifikası almanız gerekir.