본문 바로가기
카테고리 없음

[Maven] 'Received fatal alert: protocol_version', 'peer not authenticated' 에러 해결방법

by A6K 2021. 5. 5.

개발서버의 환경이 바뀌는 경우 '메이븐(Maven)'이 'Received fatal alert: protocol_version', 'peer not authenticated'에러를 발생시키면서 실패하는 경우가 있다. 다음과 같은 에러 메시지를 출력하면서 실패하게 된다.

...
[ERROR] Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5: Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to central (https://repo.maven.apache.org/maven2): Received fatal alert: protocol_version -> [Help 1]                            
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.                     
[ERROR] Re-run Maven using the -X switch to enable full debug logging.                                  
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginResolutionException  
...

짧은 영어로 번역을 해보자면, 프로토콜의 버전이 맞지 않아 메이븐 센트럴(Central)에서 "maven-clean-plugin:jar:2.5"를 다운로드 할 수 없다는 의미의 에러 메시지다. 이 에러의 의미를 이해하기 위해서는 우선 '메이븐 센트럴'이 뭔지 알아야한다.

메이븐 센트럴 저장소(Maven Central Repository)

메이븐(Maven)의 공식 문서에 가보면 '센트럴 저장소(Central Repository)'에 대한 설명을 찾아볼 수 있다. (참고자료 : introduction-to-repositories - 메이븐) 메이븐은 프로젝트에서 사용할 의존성 패키지(라이브러리)의 저장소 위치를 pom.xml 파일에 별도로 명시하지 않으면 "메이븐 센트럴"이라고 하는 곳에서 다운로드한다.

이번에 마주친 문제는 메이븐 센트럴에서 플러그인을 다운로드 할 수 없다는 의미다.

에러 메시지를 기반으로 검색을 해보니 TLS 프로토콜 버전과 관련된 문제였다. 메이븐은 2018년 6월 18일부터 보안 이슈가 있었던 TLS 1.0과 TLS 1.1 프로토콜을 이용하는 클라이언트에 대해서 메이븐 센트럴로의 접근을 차단하고 있다. 때문에 TLS1.0, TLS1.1 프로토콜을 사용하는 메이븐 클라이언트는 센트럴 저장소에 접근할 수 없다.

메이븐에 따르면 이미 자바8부터 TLSv1.2를 기본으로 사용하고 있으며, 통계에 의하면 자바6, 자바7을 사용하는 환경에서 메이븐 센트럴 저장소에 접근하는 경우는 전체 유저의 0.2% 가량 밖에 안된다고 한다. 

메이븐의 이와 같은 조치로, TLSv1.2 버전을 기본으로 사용하지 않는 Java 6, Java 7 환경에서는 이런 에러가 발생하게 되었다.

해결방법

이 문제를 해결하기 위한 방법에는 몇 가지가 있다.

1. 자바8 사용

가장 좋은 방법은 자바8 이상 버전으로 개발환경을 옮기는 것이다. 레거시 환경에 배포를 해야하는 경우를 제외하고는 이전 버전의 자바 사용은 삼가는게 좋다.

2. 메이븐 실행 옵션으로 추가

만약 레거시 환경에 배포를 해야하기 때문에 자바8 이상으로 옮겨가지 못한다고 하면 메이븐 설정이 TLSv1.2 프로토콜을 사용하도록 명시해야한다. 예를들어 메이븐을 실행할 때 다음 옵션을 주면 된다.

mvn -Dhttps.protocols=TLSv1.2 install

이렇게 옵션을 추가하면 Java 7 에서도 TLSv1.2 를 사용하게 되고, Maven Central로 문제없이 접근 가능해진다.

메이븐 실행시 매번 옵션을 주고 싶지 않다면 MAVEN_OPTS 환경변수를 이용하는 방법도 좋다.

export MAVEN_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2

그 밖에 Oracle Advanced Support 를 이용해서 Java 7 을 업그레이드 하는 방법도 있다. Java 6 이전 버전은 TLSv.12 를 지원하는지 잘 모르겠다. 그 경우 http 를 통해서 접근하도록 변경해야한다. (혹은 http://repo1.maven.org/maven2/ 도 어느정도는 유지된다고 하는데..그냥 최신 자바를 쓰도록 하자.)

댓글