SSL적용된 서버의 허용된 REST API(GET) 요청방법
개요
# [2024-07-12 16:27:28,171: [ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)'] Error SolutionBridgeRestController : [/logon] Error:
# javax.net.ssl.SSLHandshakeException: General SSLEngine problem
❗같은서버 내부의 서로다른 웹어플리케이션간 통신(GET요청)이 작동하지 않았다.
💡 일반적으로 사용하는 방법임에도 미동작…
원인
❗오류 발생 상황
💡 SSL 인증서가 신뢰하는 기관 인증서가 없거나 SSL/TLS암호화 버전이 맞지 않는 경우 발생
💡 연결하려는 서버의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없을 경우
💡 서버/클라이언트 사이에 사용하려는 TLS 버전이 맞지 않을 때(TLS 1.0 만 지원하는 서버에 1.2로 hand shaking 요청등)
💡 사설 인증서일 경우.
💡 TLS 통신에 사용하려는 cipher suite 가 오래되거나 지원하지 않음. (JDK 1.8 부터는 sha1 지원 안되고 sha256 이상을 사용해야 한다고 한다.)
해결방안
방법1: 의미없는 TrustManager 오버버라이딩으로 SSL통과(우회) 하는 방법
public void disableSSL() throw Exception {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType){
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
}
❗GET요청 통신전에 적용하면 된다.
방법2: 위 방법의 심화
public void disableSSL() throw Exception {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType){
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
SSLContext sc = SSLContext.getInstance("TLS1.2");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
// 모든 호스트명을 신뢰하도록 설정(HostnameVerifier)
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
//Default SSLContext와 HostnameVerifier 설정
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}
위 코드를 Http GET요청 이전에 실행하면된다
전체 소스코드
String uid = SOULTION_SERIVCE.getUserId(); //C000002
/********************************
* SSL 통과처리 실행
********************************/
disableSSL();
/********************************
* GET 요청
********************************/
//URL url = new Url("https", "localhost", 9510, "https://localhost:9510/bck/app/getSolutionSession?uid=" + uid + "&sid=" + request.getSession.getId(), new sun.net.www.protocol.https.Handler());
URL url = new Url("http://localhost:9510/bck/app/getSolutionSession?uid="+uid+"&sid="+request.getSession.getId());
con = (httpConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "Mozila/5.0");
/********************************
* GET 요청 성공
********************************/
int status = con.getResponseCode();
if(status >= 200 && status < 300)
{
br = new BufferReader(new InputStreamReader(con.InputStream()));
String line = null;
while((line = br.readLin( != null))) {
stringBuffer.append(line);
}
String resultString = stringBuffer.toString().trim();
if(resultString.equalse("success__02")) {
//통신응답 값에 따른 로직.
} else {
//통신응답 값에 따른 로직.
}
}
Leave a comment