개발환경

javs ssl !!!

toogari 2023. 5. 17. 16:12

1. self-signed 인증파일로 서버 셋팅을 하면 client에서 ssl 인증 파일 설정을 해 주어야 함.

2. 하지만 CA 인증파일 ( 운영서버에 사용할 수 있는) 로 서버 세팅하면 client에서는 ssl 관련 설정을 SKIP할 수 있음.

3. ssl 관련 설정을 skip한다는 것은 모든 걸 OK하는  TrustManager 방식으로 서버와 ssl 통신할 수 있다는 의미임.

4. 아래는 OkHttp3로 CA인증파일이 적용된 서버와 ssl 통신하는 샘플코드임. (POST x-www-form-urlencoded 방식)

    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>4.11.0</version>
    </dependency>
    
import okhttp3.*;

import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.util.concurrent.TimeUnit;



TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
                                throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
                                throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();


            OkHttpClient client = new OkHttpClient.Builder()
                    .readTimeout(1000, TimeUnit.MILLISECONDS).connectTimeout(200, TimeUnit.MILLISECONDS).writeTimeout(500, TimeUnit.MILLISECONDS)
                    .sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0])
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String s, SSLSession sslSession) {
                            return true;
                        }
                    })
                    .build();
                    

            RequestBody formBody = new FormBody.Builder()
                    .add("key", "value")
                    .build();
            Request request = new Request.Builder().addHeader("header", "headerValue").url("https://....").post(formBody).build();
            Response response = client.newCall(request).execute();
            System.out.println(response.body().string());