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