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();
|