인터넷이 가능한 환경임에도 불구하고 PKIX path building failed 오류처리 방안

인터넷이 가능한 환경임에도 불구하고 PKIX path building failed 오류가 발생하는 이유는, 네트워크 보안 장비(방화벽, Proxy, 보안 솔루션)가 SSL 트래픽을 복호화하여 검사하는 과정에서 자체 생성한 인증서를 사용하기 때문입니다. Java(JRE/JDK)가 이 보안 장비의 인증서를 신뢰할 수 있는 기관(CA)으로 인식하지 못해 연결을 차단하는 것입니다.

이 문제를 해결하기 위한 **근본적인 해결책(인증서 등록)**과 **구조적 해결책(Nexus 구축)**을 정리해 드립니다.


1. 근본적인 해결책: Java Truststore에 인증서 등록

Nexus를 구축하기 전에도, Java가 외부 망에 접속할 수 있게 하려면 이 작업이 필요할 수 있습니다.

  1. 인증서 추출: 브라우저(Chrome 등)에서 https://repo.maven.apache.org에 접속한 후, 주소창의 자물쇠 아이콘을 클릭하여 인증서(파일 형식 .cer)를 내보내기 합니다. (보통 회사망이라면 회사 보안 인증서를 추출해야 합니다.)

  2. Java에 등록: 관리자 권한으로 터미널을 열고 다음 명령어를 실행합니다.

    Bash

    keytool -import -alias maven_repo -keystore "C:\Program Files\Java\jdk-xx\lib\security\cacerts" -file "내보낸인증서경로.cer"
    # 기본 비밀번호: changeit
  3. Maven 재실행mvn package를 다시 시도합니다.


2. 로컬/사내 Nexus 서버 구축 (권장 방안)

인터넷망이더라도 Nexus를 구축하면 빌드 속도 향상, 라이브러리 관리 중앙화, SSL 문제 일괄 해결 등의 장점이 있습니다.

① Nexus 설치 (Docker 사용 시 가장 간편)

Docker가 설치되어 있다면 한 줄로 실행 가능합니다.

Bash

docker run -d -p 8081:8081 --name nexus sonatype/nexus3

(설치형은 Sonatype 홈페이지에서 다운로드 후 bin/nexus.exe run 실행)

② Nexus 설정 (Proxy Repository)

  1. http://localhost:8081 접속 (초기 비번은 서버 내 admin.password 파일 확인)

  2. Repository 설정: 기본적으로 생성되어 있는 maven-central (Proxy type) 확인.

    • Remote Storage가 https://repo1.maven.org/maven2/로 되어 있는지 확인.

  3. SSL 설정 (Nexus 단에서): 만약 Nexus 서버 자체도 인터넷망의 보안 장비 때문에 에러가 난다면, Nexus 관리자 메뉴의 SSL Certificates 메뉴에서 Fetch from URL 기능을 통해 Maven Central의 인증서를 직접 추가할 수 있습니다.

③ Maven settings.xml 수정

개발자 PC의 Maven이 직접 인터넷으로 가지 않고, 로컬 Nexus를 거치도록 설정합니다.

Xml

<settings>
  <mirrors>
    <mirror>
      <id>nexus-local</id>
      <mirrorOf>*</mirrorOf> <!-- 모든 요청을 Nexus로 통합 -->
      <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
</settings>

3. Proxy 설정이 필요한 경우 (회사 망)

인터넷이 가능한 환경임에도 불구하고 PKIX path building failed 오류처리 방안

인터넷망이지만 Proxy 서버를 거쳐야만 외부로 나갈 수 있는 환경이라면 settings.xml에 프록시 정보를 넣어야 합니다.

Xml

<proxies>
  <proxy>
    <id>my-proxy</id>
    <active>true</active>
    <protocol>http</protocol>
    <host>프록시서버주소</host>
    <port>8080</port>
    <!-- 인증이 필요한 경우 -->
    <username>아이디</username>
    <password>비밀번호</password>
    <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
  </proxy>
</proxies>

4. 임시 방편 (보안상 비권장)

인증서 체크를 강제로 무시하고 빌드하는 방법입니다. (임시 확인용으로만 사용하세요.)

Bash

mvn package -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

요약 및 제언

  1. 단순 해결: 1번 방법(인증서 등록)으로 Java가 보안 장비의 인증서를 인식하게 만드세요.

  2. 구조적 해결: 2번 방법(Nexus 구축)을 통해 팀 전체의 라이브러리 관리를 중앙화하세요. Nexus 서버 한 곳에만 인증서 설정을 해두면 모든 개발자가 개별 설정 없이 편리하게 빌드할 수 있습니다.

  3. 원인 파악: 현재 발생한 PKIX 에러는 인터넷 유무의 문제라기보다, **”중간에 가로채는 보안 인증서를 Java가 믿지 못하는 문제”**임을 이해하는 것이 중요합니다.