सुरक्षा पहले से ही एक कठिन विषय है, लेकिन मैं सबसे लोकप्रिय समाधान यह देखकर निराश हूं कि सुरक्षा हस्ताक्षर हटाना है। JCE को इन हस्ताक्षरों की आवश्यकता है । Maven शेड BouncyCastle जार फ़ाइल को विस्फोट करता है जो हस्ताक्षर को META-INF में डालता है, लेकिन 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
जेसीई प्रदाता को प्रमाणित नहीं कर सकता क्योंकि हमने क्रिप्टोग्राफिक हस्ताक्षरों को इसी धागे में कहीं और सुझाव का पालन करके हटा दिया है ।
मुझे जो समाधान मिला वह निष्पादन योग्य पैकर प्लगइन था जो एक एकल, निष्पादन योग्य जार में बाउंसीकैस्टल हस्ताक्षर को संरक्षित करने के लिए जार-इन-जार दृष्टिकोण का उपयोग करता है ।
अद्यतन :
ऐसा करने का एक और तरीका (सही तरीका?) मावेन जार साइनर का उपयोग करना है । यह आपको सुरक्षा त्रुटियों को प्राप्त किए बिना मावेन छाया का उपयोग करने की अनुमति देता है। फिर भी, आपके पास एक कोड हस्ताक्षर प्रमाणपत्र होना चाहिए (ओरेकल "जावा कोड साइनिंग सर्टिफिकेट" की खोज करने का सुझाव देता है)। पोम विन्यास इस तरह दिखता है:
<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 प्रमाणपत्र प्राप्त करना होगा।