금융권 폐쇄망 환경에서 외부 시스템 연동 : SSL 인증서 설정 삽질기

Chooooo·2024년 12월 10일
0

회사 트러블슈팅

목록 보기
1/1

배경

현재 내가 진행하고 있는 프로젝트에서 그룹 공통 플랫폼(SWING)의 전자검수 서비스를 연동해야 했다. 금융권은 보안상의 이유로 폐쇄망 환경에서 개발 및 운영되는데, 이러한 환경에서 외부 시스템과 통신하기 위해서 복잡한 설정이 필요했다.

직면 문제

전자검수 시스템 개발 중 외부 도메인(swingXXX.shinhan.com)과의 통신에서 두 가지 주요 문제가 발생했다.

첫 번째는 도메인 해석 문제였다. (일단 jdk1.7이라...) HTTP 클라이언트 라이브러리를 사용해 SWING 그룹 공통 플랫폼의 전자검수 서비스를 호출했지만, java.net.UnknownException이 발생했다. 폐쇄망 환경에서 외부 도메인을 해석할 수 없기 때문...

두 번째는 SSL 인증서 검증 실패 문제이다. 도메인 해석 문제를 해결한 후에는 sun.security.validator.ValidatorException:PKIX path building failed 오류 발생. 이는 HTTPS 통신 시 서버의 SSL 인증서를 신뢰할 수 없다는 의미이다.

해결 과정

1. 도메인 매핑 설정

첫 번째 문제를 해결하기 위해서 로컬 시스템의 hosts 파일에 도메인-IP 매핑을 추가했다. 이는 DNS 서버를 거치지 않고 로컬에서 직접 도메인을 해석할 수 있게 해주는 방법이다. (폐쇄망 환경에서는 도메인을 해석할 수 없기 때문)

[서버IP] swingXXX.shinhan.com
  • Windows 시스템의 hosts 파일 : C:\Windows\System32\drivers\etc

2-1. SSL 인증서 등록 : SSL 인증서를 JRE에 직접 등록

운영 환경에서는 SSL 인증서가 등록되어 있기 때문에 개발 환경 내에 임시 해결책으로 JRE에 직접 SSL 인증서를 등록했다.

  1. InstallCert.java 파일을 JDK의 bin 폴더로 복사
  2. 컴파일 : javac InstallCert.java
  3. 인증서 정보 확인 및 등록 : java InstallCert swingXXX.shinhan.com
  4. 인증서 추출 및 JRE에 등록
keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias swingXXX.shinhan.com-1

keytool -importcert -keystore "[JRE경로]\lib\security\cacerts" -storepass changeit -file output.cert -alias swingXXX.shinhan.com-1

2-2 SSL 인증서 등록 : 인증서 검증을 우회

코드 내에서 SSL 인증서 검증 과정을 우회하는 방식 사용

TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() { return null; }
        public void checkClientTrusted(X509Certificate[] certs, String authType) { }
        public void checkServerTrusted(X509Certificate[] certs, String authType) { }
    }
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

위 메서드를 활용해서 SSL 인증서 검증을 무시. 하지만 이건 로컬 환경에서만 가능. 개발 환경, 운영 환경에서는 이렇게 하면 안됨. -> 나는 1번 과정을 통해 해결

개발 환경 설정

이클립스에서 새로 등록한 인증서를 사용하기 위해 JRE 설정을 변경했다.

  1. Windows > Preferences > Java > Installed JREs

    • JDK와 JRE 모두 등록
    • JRE를 기본값으로 설정
  2. 프로젝트의 Java Build Path > Workspace default JRE 선택


이렇게 해결한 것은 로컬에서 개발 환경을 위한 임시 해결책

실제 운영 환경에서는 TLS(SSL) 인증서 발급 받아서 사용.

고찰

금융권은 확실히 폐쇄망이라서 (보안이 최우선이라서...) HTTP 클라이언트 사용 시 추가 설정이나 절차가 필요하다... HTTP 클라이언트 사용해서 애플리케이션에서 다른 서버나 서비스의 HTTP 통신을 수행할 때 조차도 제약이 발생한다.

이번에 로컬 hosts 폴더 내 따로 설정을 해주면 도메인을 해석할 수 있다는 것을 처음 알게 되었다.

또한 전자검수 시스템은 SWING 플랫폼의 토큰 발행 후 해당 토큰으로 전자 결재 서비스를 요청하는 방식으로 동작한다. Java 1.7 환경에서 HttpsURLConnection HTTP 클라이언트 라이브러리를 사용해서 HTTPS 통신을 구현했다. 현대의 개발 환경이라면 WebClient나 RestClient와 같은 더 편리한 HTTP 클라이언트를 사용할 수 있지만, Jdk 1.7 환경에서는 제한적이었다.

개발 환경 설정에서 JDK와 JRE의 역할을 이해하는 것도 중요했다. JDK는 개발 도구를 포함한 전체 패키지이고, JRE는 실제 프로그램 실행 환경이다. 인증서는 JRE의 신뢰 저장소에 저장되기 때문에 개발 환경 설정 시에 JRE 세팅이 중요했다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글