[java] "ملف توقيع غير صالح" عند محاولة تشغيل. jar



Answers

لأولئك الذين حصلوا على هذا الخطأ عند محاولة إنشاء uber-jar مع maven-shade-plugin ، فإن الحل هو استبعاد ملفات التوقيع الظاهرة عن طريق إضافة السطور التالية إلى تكوين المكون الإضافي:

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
    <!-- Additional configuration. -->
</configuration>
Question

يتم حزم برنامج جافا الخاص بي في ملف جرة ويستفيد من مكتبة جرة الخارجية ، وقلعة نطاط . تتحول التعليمة البرمجية الخاصة بي بشكل جيد ، ولكن تشغيل الجرة يؤدي إلى الخطأ التالي:

استثناء في الموضوع "main" java.lang.SecurityException: ملخص ملف التوقيع غير صالح لخصائص رئيسية تظهر

لقد غوغد لأكثر من ساعة البحث عن تفسير ووجد القليل جدا من القيمة. إذا كان أي شخص قد شاهد هذا الخطأ من قبل ويمكن أن يقدم بعض المساعدة ، فسأكون مضطرًا.




كان لي هذه المشكلة عند استخدام IntelliJ IDEA 14.01.

تمكنت من إصلاحها من خلال:

File-> بنية المشروع-> إضافة جديد (المصنوعات اليدوية) -> jar-> من الوحدات النمطية مع التبعيات على إنشاء جرة من إطار الوحدة النمطية:

اختر الفصل الرئيسي لك

JAR File from Libraries تحديد نسخة إلى دليل الإخراج والارتباط عبر البيان







من المحتمل أن تكون بعض تبعياتك قد وقعت على jarfiles. عند دمجهم جميعًا في jarfile كبير ، فإن ملفات التوقيع المقابلة لا تزال موجودة ، ولم تعد تتطابق مع jarfile "المجمعة الكبيرة" ، لذلك يتوقف وقت التشغيل عن التفكير في أن ملف jar قد تم العبث به (والذي ... تحدث).

يمكنك حل المشكلة عن طريق حذف ملفات التوقيع من تبعيات jarfile. للأسف ، لا يمكن القيام بذلك في خطوة واحدة في النمل .

ومع ذلك ، تمكنت من الحصول على هذا العمل مع Ant في خطوتين ، دون تحديد كل اعتماد على jarfile ، وذلك باستخدام:

<target name="jar" depends="compile" description="Create one big jarfile.">
    <jar jarfile="${output.dir}/deps.jar">
        <zipgroupfileset dir="jars">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>
    <sleep seconds="1" />
    <jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
        <zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
        <manifest>
            <attribute name="Main-Class" value="com.mycompany.MyMain" />
        </manifest>
    </jar>
</target>

من المفترض أن يمنع عنصر السكون الأخطاء المتعلقة بالملفات ذات تواريخ التعديل في المستقبل .

اختلافات أخرى وجدت في المواضيع المرتبطة لم تعمل بالنسبة لي.




الأمن بالفعل موضوع صعب ، لكنني أشعر بخيبة أمل لرؤية الحل الأكثر شيوعًا هو حذف توقيعات الأمان. JCE يتطلب هذه التوقيعات . Maven shade ينفجر ملف BouncyCastle jar الذي يضع التوقيعات في META-INF ، لكن التوقيعات BouncyCastle ليست صالحة لجرة جديدة (فقط لجرة BC) ، وهذا ما يسبب خطأ التوقيع غير صحيح في هذا الموضوع .

نعم ، يؤدي استبعاد التوقيعات أو حذفها كما اقترحها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 في وعاء واحد قابل للتنفيذ.

تحديث :

طريقة أخرى للقيام بذلك (الطريقة الصحيحة؟) هو استخدام مافن جرة الموقع . هذا يسمح لك بالاستمرار في استخدام Maven shade دون الحصول على أخطاء أمنية. ومع ذلك ، يجب أن يكون لديك شهادة توقيع رمز (يقترح 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.




إذا كنت تحصل على هذا عند محاولة ربط ملفات JAR لمشروع ربط Xamarin.Android مثل:

JARTOXML: تحذير J2XA006: تم رفع خطأ في الصف في عداد المفقودين أثناء عكس com.your.class: ملخص ملف التوقيع غير صالح للخصائص الرئيسية لل Manifest

مجرد فتح ملفات JAR باستخدام برنامج Winzip وحذف الدلائل الفوقية. إعادة البناء - العمل المنجز




خطأ: حدث خطأ في JNI ، يرجى التحقق من التثبيت الخاص بك وحاول مرة أخرى استثناء في java.lang.Security thread "main" thread: ملخص ملف التوقيع غير صالح لسمات Manifest الرئيسية في sun.security.util.SignatureFileVerifier.processImpl (SignatureFileVerifier.java: 314) at sun.security.util.SignatureFileVerifier.process (SignatureFileVerifier.java:268) at java.util.jar.JarVerifier.processEntry (JarVerifier.java:316) at java.util.jar.JarVerifier.update (JarVerifier.java : 228) في java.util.jar.JarFile.initializeVerifier (JarFile.java:383) في java.util.jar.JarFile.getInputStream (JarFile.java:450) at sun.misc.URLClassPath $ JarLoader $ 2.getInputStream (URLClassPath .java: 977) at sun.misc.Resource.cachedInputStream (Resource.java:77) at sun.misc.Resource.getByteBuffer (Resource.java:160) at java.net.URLClassLoader.defineClass (URLClassLoader.java:454) at java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) at java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) at java.net.URLClassLoade r $ 1.run (URLClassLoader.java:362) at java.security.AccessController.doPrivileged (Native Method) at java.net.URLClassLoader.findClass (URLClassLoader.java:361) at java.lang.ClassLoader.loadClass (ClassLoader.java : 424) at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) at java.lang.ClassLoader.loadClass (ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

ما ساعدني (IntelliJ IDEA 2016.3): File -> Project Structure -> Artifacts -> Add JAR -> Select Main Class -> Choose "copy to the output directory and link via manifest" -> OK -> Apply -> Build - > بناء المصنوعات ... -> البناء




Links