이클립스 자바오류(Received fatal alert: handshake_failure) – java.lang.IllegalArgumentException: Cannot support TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 with currently installed providers / curl: (35) SSL connect error
발생오류
자바에서 API 테스트중 아래와 같은 오류가 발생
>>Received fatal alert: handshake_failure
>>java.lang.IllegalArgumentException: Cannot support TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 with currently installed providers
Curl로 테스트 해보니 아래와 같은 에러 발생
curl: (35) SSL connect error
클라이언트에서 로그확인
SSLParameters params = SSLContext.getDefault().getSupportedSSLParameters();
String[] cipher = params.getCipherSuites();
for(int i=0; i<cipher.length; i++) {
logger.info(“chiper : “+cipher[i]);
}
위의 코드로 로그를 찍어 jdk1.7에서 사용중인 치퍼 확인.
jdk 1.7 TLS 알고리즘과 api 보내는 서버에서 사용하는 인증서 버전이 맞지 않아 발생한 문제로 추정
서버정보 확인
nslookup으로 api 서버 IP 확인
위의 예에서 211.249.222.33 이라고 예를들면
Api를 전송하는 서버에서 아래의 명령어로 서버의 정보를 확인가능.
openssl s_client -connect 211.249.222.33:443
요론식으로 프로토콜, 치퍼 등 각종 정보 확인 가능
원인
현재 클라이언트단(jdk1.7)에서 전송하는건 TLSv1로 확인되고 서버 쪽 확인을 해보니 TLSv1.2버전 사용중임을 확인.
(was 에서 java, jsp 파일 등을 통해 rest api(https)통신을 하게되면 ssl 프로토콜을 사용하는데, 이때 was가 사용하면 java(jdk)버전 에 따라 위와 같은 오류가 발생 할 수 있음)
Jdk 1.7에서 AES256 암호화 방식 사용하려고 하려면 jdk1.7에서는 AES256 에 대한 패치를 해줘야함.
(TLS1.2미만인 경우,점차 많은 서비스들이 지원이 안될 예정이니 사용을 지양하는 편이 정신건강에 좋다)
해결방법
Jdk 버전을 8이상으로 올리면 가장 좋지만, Jdk 1.7에서 AES256 암호화 방식 사용하려면 [Java Cryptography Extension(JCE)]패치를 해줘야하는데
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
위의 경로에서 해당 버전 파일을 받은 후 압축 풀면 local_policy.jar, US_export_policy.jar 두개의 파일이 보인다.
요 2개의 파일을 ${JAVA_HOME}/jre/lib/security 폴더로 덮어쓰면 해결 됨.