본문 바로가기
Develop

[Error] invalid signature file digest for manifest main attributes 해결

by 빈급 2024. 6. 11.

 오늘은 사내 프레임워크 고도화를 하면서 마주친 invalid signature file digest for manifest main attributes 오류에 대해서 설명하고 해결 방법까지 기록해 보겠습니다!

오류 화면1

 

 해당 오류는  찾아본 결과 일반적으로 over-jar를 생성하는 과정에서 발생한다고 합니다.

 

 over-jar란?

 'uber'라는 말은 독일어로서, 'above' 또는 'over'라는 단어로 해석할 수 있습니다. 즉 uber-jar == over-jar인 것입니다.

 over-jar는 자바 애플리케이션의 모든 패키지와, 그에 의존관계에 있는 패키지 라이브러리까지 모두 하나의 'jar'에 담겨 있는 것을 말합니다.

 

 모든 jar 파일이 그러진 않고 몇몇 jar 파일들은 보안을 강화하기 위해 서명되어 있습니다. 이러한 서명된 jar 파일들을 위에 설명처럼 하나의 jar로 결합하게 되면 서명이 변경되고, 서명이 일치하지 않아 오류가 발생합니다. 서명된 jar는 RSA, SF, DSA라는 확장자를 가진 파일을 META-INF 디렉터리에 가지고 있습니다.

 

 해결 방법은 이런 서명 파일들은 제외하고 패키징 하는 것입니다! 자 그럼 바로 해결법을 알아보겠습니다~ 개발자에겐 시간이 없으니..! 저는 ant build만 사용해서 이 해결법만 기록하고 maven 해결법은 링크에 첨부하겠습니다.

 

Ant Build에 해결 방법

 먼저 RSA, SF, DSA 확장자를 가진 jar를 파악해야 합니다..

 나의 경우 기존의 프레임워크와 다르게 httpclient5를 사용하기 위해 종속성을 가진 jar를 추가했었어서 이 중 범인이 있을 거라고 생각했습니다.

httpclient5 종속성 리스트

 

 필수가 아닌 optional 파일부터 확인한 결과 범인은! Conscrypt OpenJDK Uber였습니다ㅎ 확인하는 방법은 그냥 추가한 jar를 반디집으로 열어서 META-INF에 존재하는 파일들을 확인하면 됩니다!

jar 하위 파일 확인

 

 확인을 했다면 해당 jar의 META-INF 하위에 존재하는 RSA, SF, DSA  확장자 파일들을 제외하고 패키징 해주는 부분을 추가하면 됩니다!  이제 와서 쉽게 말하지만 해결하는데 오래 걸렸다. ANT BUILD를 해본 적도 없고 패키징 하는 데 사용하는 type? 이 달라서 좀 고생했습니다. 내가 선호하는 리팩토링 방식은 기존의 것은 최대한 건드리지 않고 수정하는 것이기 때문입니다!

 

 기존의 코드와 파일들은 아래 사진과 같이 spring, jakarta로 시작하는 jar파일들을 제외합니다. 이 코드에서 spring, jakarta를 제외하는 이유는 실제 프로젝트에서 사용하고 있기 때문입니다. 필요하면 exclude 안 해도 됩니다.

오류 발생 코드

 

 

 해결 방법은 아래와 같습니다.

<patternset>
    <include name="**"/>
    <exclude name="META-INF/*.SF"/>
    <exclude name="META-INF/*.DSA"/>
    <exclude name="META-INF/*.RSA"/>
</patternset>

 

오류 해결 코드

 

설명은 다음과 같습니다.

 <fileset>의 <exclude>를 사용해서 특정 jar 파일을 제외하고! 제외한 파일들 중에서 <patternset>을 사용해서 META-INF 디렉터리 내의 특정 파일들을 제거한다는 뜻입니다.

 

 기존에 사용하고 있던 코드가 <fileset>이어서 이런 방법을 사용했고 이외에 다양한 방법들도 존재한다. 이건 아래 Reference에 적어두겠습니다.

 

 어쨌든 저런 식으로 해결 후에 만들어진 jar 파일을 dependency 하고 실행을 하면 이쁘게 잘 실행됩니다~

에러 해결 후 화면