티스토리 뷰

[관련 시리즈]

발단

API를 통하여 타 기관의 데이터를 가져오는 서비스를 관리하는 중 상대 기관에서 기존에 제공하던 API url 변경 및 https 적용 작업이 있다하여 작업을 준비 하였음.

해당 기관 말고도 다른 API에서도 https로 변경하였기 때문에 비슷한 작업이라고 추정하였음.

이전에 SSL 관련하여 비슷한 작업 (이하 이전 ssl 작업) (https://jckim-dev.tistory.com/14)

하지만 작업 후 신규 url 호출 시 아래와 같은 에러문구가 확인됨.

 javax.net.ssl.SSLHandshakeException : Received fatal alert : handshake_failure

 

참고표

java 버전별 기본TLS 버전과 지원버전에 대한 표

원인

-운영중인 서버 설정 확인

java 버전(1.7) - TLSv1.0

-해당기관 서버 설정 확인

java 버전(1.8)

TLS 설정(TLSv1.2만 허용)

 

1. 클라이언트에서 TLSv1.0으로 서버에 요청을 하기 떄문에 서버에서는 허용되지 않은 TLS 버전.

2. 서버(API제공기관)과 클라이언트(운영중인 서버)간에 TLS 버전이 호환이 되지 않기 때문.

3. java keyStore에 해당 기관의 인증서가 없을 수 있음.

 

조치

원인에 1번과 2번에 대해서는 [이전 ssl관련 작업]에서 진행하였기 때문에 3번 항목에 대한 조치를 진행하였다.

 

해당 인증서를 받기 전에 인증서 유효성 없이 정상 호출이 되는지 확인 후 정상적인 호출을 확인하여 해당 해당 발급기관의 루트인증서를 java keyStore에 저장 하였음.

 

조치방법

1. 인증서 유효성 없이 정상 호출이 되는지 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
         TrustManager[] trustCerts = new TrustManager[]{
                new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    public void checkClientTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                    }
                    public void checkServerTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                    }
                }
            };
 
         SSLContext sc = SSLContext.getInstance("TLSv1.2");
         sc.init(null, trustCerts, new java.security.SecureRandom());
         
         URL url = new URL("https://호출 url");
 
         HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
         conn.setSSLSocketFactory(sc.getSocketFactory());
cs

2. 해당 발급기관의 루트인증서를 java keyStore에 저장

1
2
3
4
keytool -importcert -alias 등록할 인증서 별칭 -keystore JAVA_HOME/jre/lib/security/cacerts -file 다운받은 루트인증서
 
cacerts에 설정된 기본 비밀번호 : changeit
 
cs

참고자료

java 버전별 지원 TLS 버전 https://www.ateam-oracle.com/tls-and-java

Windows에서 CA 인증서 가져오기 https://docs.vmware.com/kr/VMware-Horizon-7/7.13/horizon-console-administration/GUID-43F2DA27-2FDF-4425-BC99-ABA84F4F493F.html

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함