programing

jar 파일을 실행하는 동안 매니페스트 기본 특성 예외에 대한 서명 파일 다이제스트가 잘못되었습니다.

shortcode 2022. 9. 25. 15:09
반응형

jar 파일을 실행하는 동안 매니페스트 기본 특성 예외에 대한 서명 파일 다이제스트가 잘못되었습니다.

나는 내 프로젝트의 jar 파일을 실행하려고 한다.저는 inteliJ 작업을 하고 있으며, 아티팩트를 사용하여 jar 파일을 생성합니다.하지만 항아리 파일을 실행하려고 할 때마다 예외가 생깁니다.

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" 

그리고 이건 제 매니페스트 파일입니다

Manifest-Version: 1.0
Main-Class: Main

그 후 외부 라이브러리가 프로젝트에 추가되었습니다.

여기에 이미지 설명 입력

내가 뭘 잘못하고 있지?

갱신하다

여기에 이미지 설명 입력

일부 의존관계 JAR은 서명된 JAR이기 때문에 모든 것을 하나의 JAR로 결합하고 해당 JAR을 실행하면 서명된 JAR의 시그니처가 일치하지 않으므로 시그니처 불일치에 대한 보안 예외가 발생합니다.

이 문제를 해결하려면 먼저 서명된 모든 종속성 JAR을 식별한 후 제외해야 합니다.MAVEN을 사용하는지 ANT를 사용하는지에 따라 적절한 솔루션을 사용해야 합니다.아래는 그렇지만, 여기, 여기, 그리고 여기서 더 많이 읽을 수 있습니다.

메이븐:

<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>

개미:

<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>

OP 코멘트에 근거한 갱신:

"sqljdbc4.jar"는 OP의 외부 라이브러리에서 서명된 JAR이었습니다.따라서 위와 같은 시그니처 관련 파일을 체계적으로 제외하기 위해 위의 방법을 사용합니다.SF, .RSA 또는.DES 또는 기타 알고리즘파일이 진행하기 위한 올바른 방법입니다.

이러한 시그니처 파일을 제외하지 않으면 시그니처의 불일치로 인해 보안 예외가 발생합니다.

JAR의 서명 여부를 확인하는 방법:JAR 에 파일등의 파일이 포함되어 있는 경우.SF, .RSA 또는.DES 또는 기타 알고리즘파일이 서명된 JAR이 됩니다.또는 실행jarsigner -verify jarname.jar"displicate"가 출력되는지 확인합니다.

uber 항아리에서 서명 파일을 필터링하기만 하면 됩니다.

 <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>

제 경우 maven-shade-plugin을 통해 uber-jar를 사용하고 있으며, @ruhsuzbaykus가 해결책이었습니다.이 전략은 @hagrawal이 제안하는 것과 매우 유사하지만 제외는 maven-shade-plugin의 필터 설정으로 추가됩니다.

컴파일된 jar에서 보안 서명된 파일을 삭제해야 합니다.이를 수행하려면 다음 명령을 따릅니다.

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

아래 줄을 추가했습니다.build.gradle.kts그리고 그것은 문제를 해결했다.

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")
}

내 경우, 그라들 또는 메이븐을 빌드에 사용하지 않고 Architects를 Jar 타입으로 만듭니다.

아티팩트를 빌드한 후 결과가 jar file이 됩니다.이름을 .rar(또는 .zip)로 변경하고 아카이브 파일로 연 다음 META-INF 폴더를 찾아 를 사용하여 모든 find를 삭제합니다.SF, .DSA, .RSA 확장자를 다시 아카이브하고 이름을 .jar로 변경합니다.다 했어요.

META-INF 파일을 삭제하는 대신 아티팩트 정의에서 메서드를 변경했습니다.아티팩트에서 "Extracted" 라이브러리를 삭제하고 "Put in Output Root"로 다시 추가했습니다.

이렇게 하면 새 jar 파일의 변경 없이 라이브러리가 통합될 수 있습니다. 제 생각엔 라이브러리에 서명하는 것이 목적인 것 같습니다.

참고로 sqljdbc.jar도 사용하고 있습니다.

Venryx의 코멘트에 근거해, 7-Zip 의 아카이브로서 jar 파일을 열어, 를 삭제할 수 있습니다.RSA, .SF 및.직접 DSA 파일나중에 서명된 라이브러리에 따라 아티팩트를 재구성할 수 있으며 오류가 사라집니다.

Android 는 Android gradle에 있는 으로써 이 할 수 .build.gradle packagingOptions★★★★★★ 。

다음은 예를 제시하겠습니다.

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")
}

주의: 어떤 이유로 정규 표현(META-INF/*)을 사용합니다.SF)는 통하지 않았다.그래서 나는 일을 하기 위해 완전한 이름을 붙여야 한다.

같은 문제에 대해서클린 인스톨을 완료하고, 문제가 해소되었습니다.따라서 클린 인스톨은 새로 다운로드한 jar를 사용하여 구축할 수 있는 옵션 중 하나입니다.

앱을 실행할 때도 같은 문제가 있었습니다.빌드 단계에서 maven shead 플러그인이 중복된 리소스에 대해 경고했습니다.나는 내가 불필요한 항아리 의존성을 가지고 있다는 것을 깨달았다.분리하면 문제가 해결됐다.

 [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.

언급URL : https://stackoverflow.com/questions/34855649/invalid-signature-file-digest-for-manifest-main-attributes-exception-while-tryin

반응형