.jar를 실행하려고 하면 "Invalid signature file"이 표시됩니다.
내 자바 프로그램은 jar 파일로 패키징되어 외부 jar 라이브러리인 bouncy castle을 사용합니다.코드는 정상적으로 컴파일되지만 jar를 실행하면 다음과 같은 오류가 발생합니다.
스레드 "main" java.lang에 예외가 있습니다.보안.예외:매니페스트 기본 특성에 대한 서명 파일 요약이 잘못되었습니다.
나는 설명을 찾기 위해 한 시간 넘게 구글을 검색했지만 거의 가치가 없었다.이전에 이 오류를 본 적이 있고 도움을 줄 수 있는 사람이 있다면 고맙겠습니다.
이 에러는 음영 처리된 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>
gradle을 사용하여 fat jar를 만들고 사용하려는 사용자에게 다음 구문이 도움이 될 수 있습니다.
jar {
doFirst {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}
다음 명령을 사용하십시오.
zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*.DSA'
당신의 의존관계 중 일부는 서명된 jarfiles일 것입니다.모든 파일을 하나의 큰 jarfile로 결합해도 대응하는 시그니처 파일은 여전히 존재하며 "big combined" jarfile과 더 이상 일치하지 않습니다.따라서 실행 시 jar file이 변조된 것으로 간주됩니다.그렇게 말할 수 있다).
ant를 사용하고 있다고 가정하면 jarfile 의존관계에서 시그니처 파일을 삭제함으로써 문제를 해결할 수 있습니다.안타깝게도 개미에게는 한 번에 할 수 없는 일입니다.
단, 다음과 같은 방법으로 각 jarfile 의존관계를 구체적으로 명명하지 않고 Ant와 함께 작업할 수 있었습니다.
<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>
sleep 요소는 향후 수정일이 있는 파일에 대한 오류를 방지하기 위해 사용됩니다.
링크된 스레드에서 발견된 다른 변형은 작동하지 않았습니다.
여기에 나열된 솔루션이 포인터를 제공할 수 있습니다.
결론:
공식 jar를 그대로 유지하고 응용 프로그램 jar 파일의 매니페스트 파일에 종속성으로 추가하는 것이 좋습니다.
IntelliJ IDEA 14.01을 사용할 때 문제가 있었습니다.
다음 방법으로 해결할 수 있었습니다.
파일 -> 프로젝트 구조 -> 새 (Artifacts) 추가 -> jar -> [모듈에서 jar 만들기]창에 의존관계가 있는 모듈에서:
메인 클래스 선택
JAR File from Libraries 출력 디렉터리로 복사하고 매니페스트를 통해 링크합니다.
보안은 이미 어려운 주제이지만, 가장 일반적인 해결책은 보안 서명을 삭제하는 것이라는 사실에 실망했습니다.JCE 에서는, 이러한 시그니처가 필요합니다.Maven 음영으로 BouncyCastle jar 파일이 폭발하여 시그니처가 META-INF에 들어가지만 BouncyCastle 시그니처는 새로운 uber-jar(BC jar에만 해당)에는 유효하지 않기 때문에 이 스레드에서 Invalid signature 오류가 발생합니다.
네, @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 시그니처를 하나의 실행 가능한 jar에 보존하는 실행 가능한 packer 플러그인입니다.
갱신:
다른 방법(올바른 방법?)은 Maven Jar 서명자를 사용하는 것입니다.이를 통해 보안 오류 없이 Maven 음영을 계속 사용할 수 있습니다.단, 코드 서명 증명서가 필요합니다(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 증명서를 취득해야 합니다.
저도 같은 문제에 직면했습니다.어디선가 참조한 결과, 아래와 같이 변경되어 동작했습니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<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>
개미를 사용하여 jar 파일을 빌드한다고 가정하면 META-INF dir를 생략하도록 개미에게 지시할 수 있습니다.이건 내 개미 표적의 간단한 버전이야.
<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>
저는 최근에 IntelliJ를 제 프로젝트에 사용하기 시작했습니다.하지만 제 동료들 중 일부는 여전히 같은 프로젝트에서 이클립스를 사용하고 있습니다.오늘 인텔리J에서 작성한 jar 파일을 실행한 후 동일한 오류가 발생하였습니다.여기 있는 모든 솔루션이 거의 같은 것에 대해 이야기하고 있지만, 어느 솔루션도 쉽게 기능하지 않았습니다(아마도 저는 ANT를 사용하지 않기 때문에 메이븐 빌드에 다른 오류가 발생하여 http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException,에 접속할 수 있었고 서명된 항아리도 혼자서는 찾을 수 없었습니다).
마지막으로, 이것은 나에게 도움이 되었다.
zip -d demoSampler.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'
내 항아리 파일에서 뭐가 삭제됐는지 알아?
deleting: META-INF/ECLIPSE_.SF
deleting: META-INF/ECLIPSE_.RSA
이 문제는 일부 일식 관련 파일과 관련이 있는 것으로 보입니다.
도 같은 요.gradle
Jar 시; Fat Jar ; Fat Jar 갱신build.gradle
제외 행이 있는 파일에 의해 문제가 수정되었습니다.
jar {
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
manifest {
attributes 'Main-Class': 'com.test.Main'
}
}
gradle을 사용하는 경우 farJar의 전체 태스크는 다음과 같습니다.
version = '1.0'
//create a single Jar with all dependencies
task fatJar(type: Jar) {
manifest {
attributes 'Implementation-Title': 'Gradle Jar File Example',
'Implementation-Version': version,
'Main-Class': 'com.example.main'
}
baseName = project.name + '-all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
with jar
}
새 라이브러리를 추가하기 전에 새 jar의 META-INF 폴더를 이전 jar와 비교합니다.새로운 파일이 있을 가능성이 있습니다.이 경우 제거할 수 있습니다.도움이 될 거야경구 999michal님
전략은 ANT를 사용하여 각 Jar 파일에서 시그니처 삭제를 단순화하는 것입니다.다음의 순서로 진행됩니다.
- 매니페스트를 복사하고 있습니다.임시 파일의 MF
- 임시 파일에서 이름 및 SHA 항목 제거
- 임시 매니페스트를 사용하여 임시 Jar 파일 생성
- 임시 매니페스트 제거
- 원래 Jar 파일을 임시 파일과 스왑
<macrodef name="unsignjar" description="To unsign a specific Jar file">
<attribute name="jarfile"
description="The jar file to unsign" />
<sequential>
<!-- Copying to the temporary manifest file -->
<copy toFile="@{jarFile}_MANIFEST.tmp">
<resources>
<zipentry zipfile="@{jarFile}" name="META-INF/MANIFEST.MF"/>
</resources>
</copy>
<!-- Removing the Name and SHA entries from the temporary file -->
<replaceregexp file="@{jarFile}_MANIFEST.tmp" match="\nName:(.+?)\nSH" replace="SH" flags="gis" byline="false"/>
<replaceregexp file="@{jarFile}_MANIFEST.tmp" match="SHA(.*)" replace="" flags="gis" byline="false"/>
<!-- Creating a temporary Jar file with the temporary manifest -->
<jar jarfile="@{jarFile}.tmp"
manifest="@{jarFile}_MANIFEST.tmp">
<zipfileset src="@{jarFile}">
<include name="**"/>
<exclude name="META-INF/*.SF"/>
<exclude name="META-INF/*.DSA"/>
<exclude name="META-INF/*.RSA"/>
</zipfileset>
</jar>
<!-- Removing the temporary manifest -->
<delete file="@{jarFile}_MANIFEST.tmp" />
<!-- Swapping the original Jar file with the temporary one -->
<move file="@{jarFile}.tmp"
tofile="@{jarFile}"
overwrite="true" />
</sequential>
`
이 정의는 ANT 태스크에서 다음과 같이 호출할 수 있습니다.
<target name="unsignJar">
<unsignjar jarFile="org.test.myjartounsign.jar" />
</target>
오류: JNI 오류가 발생했습니다.설치를 확인하고 스레드 "main" java.lang에서 예외를 다시 시도하십시오.보안.예외:sun.security.util의 매니페스트 기본 특성에 대한 서명 파일 다이제스트가 잘못되었습니다.sun.security.util의 SignatureFileVerifier.processImpl(SignatureFileVerifier.java:314).java.util.jar의 Signature FileVerifier.process(Signature FileVerifier.java:268)입니다.JarVerifier. 프로세스java.util.jar의 엔트리(JarVerifier.java:316).jarVerifier.update(JarVerifier.java:228)를 지정합니다.jarFile.initializeVerifier(JarFile.java:383)를 java.util.jar로 지정합니다.jarFile.getInputStream(JarFile.java:450).URLClassPath$JarLoader$ 2.getsun.misc의 InputStream(URClassPath.java:977)sun.misc의 Resource.cachedInputStream(Resource.java:77)입니다.자원getByteBuffer(Resource.java:160)를 참조해 주세요.java.netURLClassLoader.defineClass(URLClassLoader.java:454)를 참조해 주세요.java.netURLClassLoader.access$100(URLClassLoader.java:73) (java.net 에 있습니다.URLClassLoader$1.run(URLClassLoader.java:368). java.net 에 있습니다.URLClassLoader$1.run(URLClassLoader.java:362)을 java.security로 설정합니다.AccessController.doPrivileged(네이티브 메서드)는 java.net에 있습니다.URLClassLoader.java.lang의 findClass(URLClassLoader.java:361)를 지정합니다.sun.misc의 ClassLoader.loadClass(ClassLoader.java:424).java.lang의 런처$AppClassLoader.loadClass(Launcher.java:331).sun.launcher에 ClassLoader.loadClass(ClassLoader.java:357)가 표시됩니다.런처Helper.checkAndLoadMain(런처)Helper.java:495)
도움이 된 것 (IntelliJ IDEA 2016.3): 파일 -> 프로젝트 구조 -> 아티팩트 -> JAR 추가 -> 메인 클래스 선택 -> 출력 디렉토리에 복사하여 매니페스트 경유 링크 -> 적용 -> 빌드 -> 빌드 아티팩트...-> 빌드
두 명의 다른 서명자가 자바 마인드를 망쳤을 수 있습니다.
META-INF 폴더를 jar에서 삭제하고 매니페스트를 추가한 후 JAR에 다시 서명해 보세요.http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main-attributes/
원래의 라이브러리를 언팩하거나 변경하지 않고 특별한 JAR 클래스로더를 탑재한 Fat JAR 솔루션을 찾고 있다면 여기를 참조하십시오.
면책사항:코드를 작성하지 않고, 패키징해 Maven Central에 공개해, 사용법을 제 read-me에 기재했습니다.
개인적으로 BouncyCastle 종속성을 포함하는 실행 가능한 uber JAR을 만들기 위해 사용합니다.아마 당신에게도 유용할 거예요.
승인된 솔루션에 문제가 있는 경우 DontIncludeResourceTransformer를 사용하여 음영 처리된 항아리에서 리소스를 제외하는 다른 방법이 있습니다.
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>BC1024KE.DSA</resource>
</transformer>
</transformers>
Shade 3.0부터는 이 트랜스폼이 자원 목록을 받아들입니다.그 전에 여러 개의 변압기를 각각 하나의 리소스와 함께 사용하면 됩니다.
Intelij에서 Intelij가 "관리되지 않는 폼 파일을 찾았습니다"라고 했을 때, 결론적으로 "Add as a Maven Project"를 클릭했을 때 이 일이 일어났습니다.그러는 동안 out 폴더가 이미 생성되었습니다.그래서 최근 변경은 받지 않았습니다.
폴더를 삭제하고 프로그램을 실행하면 문제가 해결되었습니다.그런 다음 out 폴더가 다시 작성되었습니다.
Little Fox의 답변도 참조하십시오.내가 받은 오류는 그의 오류와 매우 유사했다.
그림자를 사용하여 항아리를 생성할 수 있습니다.
Shadow는 프로젝트의 종속성 클래스와 리소스를 단일 출력 Jar로 결합하기 위한 Gradle 플러그인입니다.결합된 자르는 종종 fat-jar 또는 uber-jar라고 불린다.
build.gradle
plugins { ... // ① Add the shadow plugin id "com.github.johnrengelman.shadow" version "5.2.0" } ... // ② Config the shadow jar, its name is baseName-1.0-classifier.jar shadowJar { archiveBaseName.set('baseName') archiveClassifier.set('classifier') archiveVersion.set('1.0') manifest { attributes 'Main-Class': 'Main' } } // ③ Disable the default jar task jar.enabled = false // ④ Execute the shadowJar task when compiling build.dependsOn(shadowJar)
합니다.
gradle build
jar 파 , 。- <프로젝트 디렉토리>/build/libs/baseName-1.0-classifier.jar
저도 비슷한 문제가 있었어요.그 이유는 Windows 박스의 디폴트 JRE와는 다른 JDK를 사용하여 컴파일하고 있었기 때문입니다.
올바른 java.exe를 사용하면 문제가 해결되었습니다.
Xamarin의 JAR 파일을 바인드하려고 할 때 이 메시지가 뜨는 경우.Android 바인딩 프로젝트는 다음과 같습니다.
JARTOXML : warning J2XA006: missing class error was reflecting com.your.class : 매니페스트 기본 특성에 대한 잘못된 서명 파일 다이제스트가 발생했습니다.
Winzip을 사용하여 JAR 파일을 열고 meta-inf 디렉토리를 삭제하기만 하면 됩니다.재구축 - 작업 완료
언급URL : https://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
'programing' 카테고리의 다른 글
Vue 구성 요소 이벤트에서 Apollo 쿼리를 트리거하는 방법은 무엇입니까? (0) | 2022.09.03 |
---|---|
Java 메인 메서드가 정적인 이유는 무엇입니까? (0) | 2022.09.03 |
Vuejs 웹 팩 압축 플러그인이 압축되지 않음 (0) | 2022.09.03 |
.a.o 파일과 .lo 파일의 차이점 (0) | 2022.09.03 |
Vue-cli: git bash 창에서 새 프로젝트를 만드는 동안 화살표 키가 작동하지 않습니다. (0) | 2022.09.03 |