HttpsURLConnection을 이용한 통신시 SSL 인증서 수동으로 지정하는 방법

Https를 이용하여 데이터를 주고 받을때 SSL 인증을 해야한다.

기본적으로

1
2
3
4
System.setProperty("javax.net.ssl.keyStore",context.getKeyFile().getAbsolutePath());
System.setProperty("javax.net.ssl.keyStorePassword", context.getKeyFilePassword());
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("http.keepAlive","false”);

이런식으로 System property를 추가해주면 HttpsURLConnection을 생성할때 자동으로 SSL인증서를 포함 시키지만 간혹 이방법이 안되는 경우가 있다.

이럴때는 수동으로 SSLContext에 keystore를 등록해주면 해결이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
KeyStore clientStore = KeyStore.getInstance("PKCS12");
clientStore.load(new FileInputStream("test.p12"), "testPass".toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, "testPass".toCharArray());
KeyManager[] kms = kmf.getKeyManagers();

KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream(System.getProperty("java.home") + "/lib/security/cacerts"), "changeit".toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
TrustManager[] tms = tmf.getTrustManagers();

SSLContext sslContext = null;
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kms, tms, new SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
URL url = new URL("https://www.testurl.com");

HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection();
공유하기