Ongeldige samenvatting van handtekeningbestand voor Manifest-uitzondering hoofdkenmerken tijdens poging jar-bestand uit te voeren

Ik probeer het jar-bestand van mijn project uit te voeren. Ik werk aan intelliJ en gebruik artefacten om het jar-bestand te genereren. Maar elke keer dat ik mijn jar-bestand probeer uit te voeren, krijg ik een uitzondering.

java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284)
    at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238)
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316)
    at java.util.jar.JarVerifier.update(JarVerifier.java:228)
    at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
    at java.util.jar.JarFile.getInputStream(JarFile.java:450)
    at sun.misc.JarIndex.getJarIndex(JarIndex.java:137)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:839)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:831)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:830)
    at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:803)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:530)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:520)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:519)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:492)
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
    at sun.misc.URLClassPath.getResource(URLClassPath.java:211)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
    at java.net.URLClassLoader$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)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 

En dit is mijn manifestbestand:

Manifest-Version: 1.0
Main-Class: Main

Vervolgens zijn de externe bibliotheken toegevoegd aan mijn project

voer hier de afbeeldingsbeschrijving in

Wat doe ik verkeerd??

bijwerken

voer hier de afbeeldingsbeschrijving in


Antwoord 1, autoriteit 100%

Sommige van uw afhankelijkheids-JAR’s zijn een ondertekende JAR, dus als u alles in één JAR combineert en die JAR uitvoert, komt de handtekening van de ondertekende JAR niet overeen en krijgt u de beveiligingsuitzondering over mis-overeenkomende handtekening.

Om dit op te lossen, moet u eerst bepalen welke alle afhankelijkheids-JAR’s ondertekende JAR’s zijn en deze vervolgens uitsluiten. Afhankelijk van of u MAVEN of ANT gebruikt, moet u een geschikte oplossing nemen. Hieronder staan, maar u kunt hier, hieren hier.

Maven:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <excludeScope>system</excludeScope>
                <excludes>META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA</excludes>
                <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

ANT:

<jar destfile="app.jar" basedir="${classes.dir}">
    <zipfileset excludes="META-INF/**/*" src="${lib.dir}/bcprov-jdk16-145.jar"></zipfileset>
    <manifest>
        <attribute name="Main-Class" value="app.Main"/>
    </manifest>
</jar>

Update op basis van de opmerking van OP:

“sqljdbc4.jar” was de ondertekende JAR in de externe bibliotheken van OP. Dus het volgen van bovenstaande aanpak om de handtekeninggerelateerde bestanden zoals .SF, .RSA of .DES of andere algoritmebestanden systematisch uit te sluiten, is de juiste manier om verder te gaan.

Als deze handtekeningbestanden niet worden uitgesloten, treedt er een beveiligingsuitzondering op vanwege de mismatch van de handtekening.

Hoe weet u of een JAR is ondertekend of niet?:Als een JAR bestanden bevat zoals bestanden zoals .SF, .RSA of .DES of andere algoritmebestanden, dan is het een ondertekende JAR. Of voer jarsigner -verify jarname.jaruit en kijk of het “geverifieerd”

oplevert


Antwoord 2, autoriteit 26%

In mijn geval werk ik met een uber-jar via maven-shade-plugin en @ruhsuzbaykus antwoord hierwas de oplossing. De strategie lijkt erg op wat @hagrawal voorstelt, maar de uitsluitingen worden toegevoegd als een filterconfiguratie van maven-shade-plugin.


Antwoord 3, autoriteit 21%

filter gewoon de handtekeningbestanden uit je uber jar

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <minimizeJar>true</minimizeJar>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

Antwoord 4, autoriteit 13%

In de gecompileerde jar moeten de door de beveiliging ondertekende bestanden worden verwijderd. Volg deze opdracht om dit te doen

zip -d jarfile.jar ‘META-INF/.SF’ ‘META-INF/.RSA’ ‘META-INF/*SF’


Antwoord 5, autoriteit 2%

In plaats van het META-INF-bestand te verwijderen, heb ik de methode in de Artefact-definitie gewijzigd. Ik heb de bibliotheek “Geëxtraheerd” uit het artefact verwijderd en opnieuw toegevoegd als “Put into Output Root”.

Op deze manier wordt de bibliotheek zonder enige wijzigingen opgenomen in het nieuwe jar-bestand, waarvan ik aanneem dat dit het doel is om de bibliotheek te ondertekenen…

Trouwens, ik gebruik ook de sqljdbc.jar.


Antwoord 6, autoriteit 2%

Ik heb onderstaande regels toegevoegd aan mijn build.gradle.ktsen het probleem is opgelost

tasks.withType<org.gradle.jvm.tasks.Jar>() {
    exclude("META-INF/BC1024KE.RSA", "META-INF/BC1024KE.SF", "META-INF/BC1024KE.DSA")
    exclude("META-INF/BC2048KE.RSA", "META-INF/BC2048KE.SF", "META-INF/BC2048KE.DSA")
}

Antwoord 7, autoriteit 2%

In mijn geval, zonder gradle of maven te gebruiken om te bouwen, maak ik Artifacts als Jar-type
voer hier de afbeeldingsbeschrijving in

Na het bouwen van Artifacts krijg ik als resultaat een jar-bestand. Ik hernoem het naar .rar (of .zip) en open het als archiefbestand, zoek dan de META-INF-map en verwijder alles met de extensie .SF, .DSA, .RSA, archiveer het opnieuw en hernoem het naar .jar. KLAAR.


Antwoord 8

Gebaseerd op Venryx’s opmerking, kunt u het jar-bestand gewoon als archief openen in 7-Zipen de .RSA-, .SF- en .DSA-bestanden rechtstreeks. U kunt uw artefact daarna opnieuw opbouwen, wat afhankelijk was van de ondertekende bibliotheek en de fout zou moeten verdwijnen.


Antwoord 9

Voor hetzelfde probleem heb ik een schone installatie gedaan en het probleem is verdwenen. Een schone installatie is dus een optie waarmee u kunt bouwen met vers gedownloade potten.


Antwoord 10

Iedereen die met een Android gradle-applicatie werkt, je kunt dit oplossen door de bestanden in build.gradleuit te sluiten in de sectie packagingOptions.

Hier is een voorbeeld:

packagingOptions {
  exclude 'META-INF/LICENSE'
  exclude 'META-INF/LICENSE.txt'
  exclude 'META-INF/MSFTSIG.SF'
  exclude 'META_INF/ECLIPSE_.SF'
  exclude("META-INF/*.kotlin_module")
}

Opmerking: om de een of andere reden werkte het gebruik van reguliere expressies (META-INF/*.SF) niet voor mij. Dus ik moet de volledige naam aan het werk geven.


Antwoord 11

Ik had hetzelfde probleem bij het uitvoeren van de applicatie. Bij build step waarschuwde de plug-in Maven Shade me voor overlappende bronnen. Ik realiseerde me dat ik een overbodige jar-afhankelijkheid heb. Na het verwijderen was het probleem opgelost.

[INFO] Skipping pom dependency com.sun.xml.ws:jaxws-ri:pom:2.3.2 in the shaded jar.
 [WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
 ...
 ...
 [WARNING] maven-shade-plugin has detected that some class files are
 [WARNING] present in two or more JARs. When this happens, only one
 [WARNING] single version of the class is copied to the uber jar.

Other episodes