SSL 통신을 위한 WAS 내 Java 설정_https 호출
WAS 내 JSP 파일등을 통해 https 통신이 필요한 경우, SSL Protocol을 사용하게 된다.
여기서 WAS가 사용하는 Java 버전 및 옵션 적용 유무에 따라 통신/인터페이스시 오류가 발생할 수 있다.
조치를 위해 아래 내용을 참고하여 설정 변경 후 WAS 재기동을 진행한다.
1. Java 버전 업그레이드
버전별 사용가능한 SSL Protocol 은 아래와 같다. 여기서 기준은 무료 버전이다.
버전 | 가능한 SSL Protocol | Default설정 | 비고 |
Java 6 (JDK 1.6.0_45) | SSL v3.0, TLS1.0 | TLS1.0 | * JDK minor 버전에 따라 지원 프로토콜 추가 |
Java 7 (JDK 1.7.0_80) | SSL v3.0, TLS1.0, TLS1.1, TLS1.2 | TLS1.0 | Default는 1.0 유지임에 주의 |
Java 8 (JDK 1.8.0_202) | SSL v3.0, TLS1.0, TLS1.1, TLS1.2 | TLS1.2 |
* JDK 1.6.0_111 이후 TLS1.1 지원, 1.6.0_121 이후 TLS 1.2 지원 (단, jsse.enableSNIExtension 등 옵션 설정은 불가능)
** TLS1.2 미만 프로토콜의 경우, Deprecated 될 예정이니 사용을 지양하는 것이 좋다.
2. 오류 로그별 Java/옵션 적용
2.1 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
1) JDK 1.7 이상으로 업그레이드를 진행한다.
이때, 반드시 Java 버전 업그레이드 후 해당 WAS에 Deploy 하여 사용중인 소스에 대한 오류 발생여부를 확인한다.
(일반적으로 Java 6->7 로 바뀜에 따른 오류는 거의 없다.)
2) 추가적으로 TLS 1.2 를 사용하도록 기동 스크립트에 아래와 같이 옵션을 추가한다.
: WAS 기동 옵션 내 JAVA HOME 디렉토리 설정이나, -D 옵션이 설정된 위치에 다음과 같은 명령어를 추가해 준다.
-Dhttps.protocols=TLSv1.2 -Djdk.tls.client.protocols=TLSv1.2
(전체 프로토콜을 허용하고 싶은 경우는 TLSv1.0,TLSv1.1,TLSv1.2 와 같이 변경하면 됨.)
2.2 javax.net.ssl.SSLHandshakeException: Received fatal alert: unrecognized_name
-> 기동 스크립트에 아래와 같이 옵션을 추가한다.
아래 옵션은 SNI(ServerNameIndex) 값을 넘기지 않겠다는 내용으로, 인식이 불가능한 문자열을 정보로 보내지 않도록 하는 설정이다.
-Djsse.enableSNIExtension=false
호출 대상/Target 서버 측에서 SNI을 통해 Domain에 따른 분기처리 등을 설정해 두었다면 아래와 같이 옵션을 설정한다.
-Djsse.enableSNIExtension=true
**** 호출 대상/Target 서버 측에서 SNI를 사용하는지 확인하는 방법은 아래와 같다. (WAS 구성 서버에서 실행)
아래 명령어 실행시 정상적으로 Handshake 가 된다면 SNI 설정을 true로 설정하는 것이 좋다.
openssl s_client -servername myserver.com -connect myserver.com:443 -state
(대상서버가 myserver.com , 443 포트 사용중이라고 가정. -servername 변수 유무를 통해 사용여부 확인가능)