mvn 'Received fatal alert: protocol_version', 'peer not authenticated' 에러 해결방법
메이븐(Maven) 프로젝트를 빌드하고 배포하는 스크립트를 만들어서 바이너리를 만들고 설치하는 과정을 단순화시켜 작업을 하고 있었다. 개발서버의 노후화로 장비 교체를 하였고, 개발중인 리파지토리를 새로운 장비에서 clone 하고 빌드&배포 스크립트를 실행시켰더니 다음과 같은 에러 메시지를 받게 되었다.
...
[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"를 다운로드 할 수 없다는 의미의 에러 메시지다. Central 이라는 곳에서 clean 플러그인을 다운로드해야하는데 서버에 접속할 수 없어서 발생하는 문제로 보인다. 우선 메이븐 Central 이 뭔지 찾아보자.
Maven Central Repository?
메이븐(Maven)의 공식 문서에 가보면 "Central"에 대한 설명을 찾아 볼 수 있다. (링크 : introduction-to-repositories - 메이븐) 메이븐은 별도로 로컬 리파지토리를 pom.xml 파일에 명시하지않는 이상 필요한 의존성 라이브러리(Dependencies)들을 "메이븐 Central"이라는 곳에서 다운로드한다.
이번에 마주친 문제는 결국 이 메이븐(Maven) Central 리파지토리에서 플러그인을 다운로드 할 수 없다는 의미다. 문제의 원인을 찾기 위해 검색을 해보니 TLS 프로토콜 버전 문제였다.
2018년 6월 18일부터 보안 이슈가 있던 TLS 1.0과 TLS 1.1 프로토콜을 이용하는 클라이언트는 더 이상 Maven Central Repository에 접근 할 수 없게 되었다. 따라서 TLS 1.0 혹은 TLS 1.1 프로토콜을 사용하는 클라이언트는 Central 리파지토리에서 플러그인을 다운로드 할 수 없다.
메이븐이 이렇게 결정하게 된 계기는 이미 Java 8부터는 TLSv1.2를 기본으로 사용하고 있기 때문이다. 메이븐의 통계에 의하면 Java 6, Java 7을 사용하는 환경에서 Maven Central 리파지토리에 접근하는 경우는 전체 유저의 0.2% 가량밖에 안된다고 한다.
메이븐의 이와 같은 조치로, TLSv1.2 버전을 기본으로 사용하지 않는 Java 6, Java 7 환경에서는 이런 에러가 발생하게 되었다.
문제 해결 방법
이 문제를 해결하기 위해 취할 수 있는 액션은 몇 가지가 있다
1. Java 8 사용하기
가장 좋은 방법은 Java 8 으로 개발환경을 옮기는 것이다. 오래된 JDK 버전의 사용은 불가피한 경우가 아니며 피하자.
2. Maven 실행 옵션으로 추가
어쩔 수 없이 Java 7 개발 환경을 사용해야 한다면, Maven 설정에 TLS 1.2 프로토콜을 사용하도록 명시하면된다. 예를 들어 다음과 같이 쓰면 된다.
mvn -Dhttps.protocols=TLSv1.2 install
이렇게 옵션을 추가하면 Java 7 에서도 TLSv1.2 를 사용하게 되고, Maven Central로 문제없이 접근 가능해진다.
혹은
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/ 도 어느정도는 유지된다고 하는데..그냥 모던 자바로 오세요.)