728x90
[ERROR][http-{마스킹}-14$515807736] [cashPayDecision]ShopCoupon balCoupon 오류 : Received fatal alert: protocol_version
[ERROR][http-myservice-7979-14$515807736] [myPayDecision]
[Exception] javax.net.ssl.SSLException: Received fatal alert: protocol_version
[Exception] cohttp://m.sun.net.ssl.internal.ssl.Alerts : getSSLException() (Line:190)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.Alerts : getSSLException() (Line:136)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.SSLSocketImpl : recvAlert() (Line:1822)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.SSLSocketImpl : readRecord() (Line:1004)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.SSLSocketImpl : performInitialHandshake() (Line:1188)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.SSLSocketImpl : startHandshake() (Line:1215)
[Exception] cohttp://m.sun.net.ssl.internal.ssl.SSLSocketImpl : startHandshake() (Line:1199)
[Exception] sun.net.http://www.protocol.https.HttpsClient : afterConnect() (Line:434)
[Exception] sun.net.http://www.protocol.https.AbstractDelegateHttpsURLConnection : connect() (Line:166)
[Exception] sun.net.http://www.protocol.http.HttpURLConnection : getOutputStream() (Line:1031)
[Exception] ... 101 More
※ 위 에러 내용은 SSL TLS버전이 지원하지 않을 때 애플리케이션에서 발생하는 에러입니다.
에러만 봐도 사실 뭐 때문인지 감은 오지만 검증이 필요했습니다.
"믿어라, 하지만 검증하라" 라고 누군가 말해 주어서말이죠..
결론만 말하면 특정 URL이 요청하는 TLS버전을 지원하지 않는 경우 이런 에러가 발생합니다.
검증 방법
Openssl을 이용한 tls 지원 버전 확인
애플리케이션에서 특정URL로 요청했을 때 해당 에러가 발생한다면 특정 URL이 TLS버전이 어떤 것을 지원하는지 'openssl'로 확인할 수 있습니다.
하지만 주의해야 할 점이 있습니다.
만약 서버에 JAVA버전을 여러개 사용하고 있고, 프로세스는 jdk1.6을 사용하고 자신의 계정의 openssl은 jdk1.8을 사용하고 있을 수 있습니다. 그래서 먼저 자신이 사용하고 있는 자바 버전이 프로세스와 동일한 자바버전을 사용하고 있는지 확인해야 합니다. 만약 버전을 다른 것을 쓰고 있는지 애플리케이션의 jdk사용버전과 openssl을 사용할 때 사용하는 버전이 무엇인지 확인하시길 바랍니다.
# Openssl이 사용하고 있는, 계정이 사용하고 있는 jdk버전 확인
$ javac -version
# 애플리케이션은 tomcat을 예시로 들면 catalina.sh에 들어가 JAVA_HOME 지정이 어떤것으로되어있는지 확인하십시오.
Openssl을 이용해 tls 지원 여부 확인 방법
아래 방법을 사용하여 특정 URL이 TLS를 지원하는지 확인할 수 있습니다. 그리고 Openssl이 설치되어있지 않는 경우 설치하는 방법도 함께 작성합니다.
# TLS 1 지원 확인
$ openssl s_client -connect example.com:443 -tls1
# TLS 1.2 지원 확인
$ openssl s_client -connect example.com:443 -tls1_2
# TLS 1.3 지원 확인
$ openssl s_client -connect example.com:443 -tls1_3
# 지원하지 않는 경우의 결과
139913320781712:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:s3_pkt.c:1493:SSL alert number 70
139913320781712:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:659:
---
no peer certificate available
---
No client certificate CA names sent
... 생략
# 지원하는 경우의 결과
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
verify return:1
---
Certificate chain
... 내용생략
openssl 패키지 설치
# Ubuntu/Debian
apt-get install openssl
# CentOS, RHEL
$ yum install openssl
TCP Dump를 이용하여 상용서버와 테스트 서버를 비교
# 특정 URL IP 확인
$ nslookup <특정domain>
# tcpdump
$ tcpdump -i <사용하고있는랜카드인터페이스> tcp and host <특정domain IP> -nn -vvv -tttt -X -A -G 100 -w <저장할경로>/tcp_ip_dump_%Y%m%d-%H%M%S.pcap -Z root
ssllabs를 이용하여 확인
해당 방법은 대상 URL이 443 포트인 경우에만 가능합니다.
- https://www.ssllabs.com/index.html에 접속하여 'Test your server'를 들어갑니다.
- 특정 URL을 입력합니다.
- 하단 Configureation에서 Protocols에서 지원하는 프로토콜을 확인합니다.
728x90
'Linux' 카테고리의 다른 글
[Server] 분산 환경에서의 Nginx-PHP-MySQL 설치 및 설정 가이드 (0) | 2024.06.26 |
---|---|
[Server] 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드 (0) | 2024.06.19 |
Nginx 수동 설치 (2) | 2024.06.05 |
ELK스택에서 Heartbeat 설치 방법 (0) | 2024.06.03 |
[Linux] JDK(JAVA) 버전 교체 및 업데이트 (0) | 2024.05.28 |