반응형
"Remote host terminated the handshake"는 Tomcat 서버에서 SSL/TLS 통신 중 발생하는 에러로, 클라이언트와 서버 간의 SSL/TLS 핸드셰이크(handshake) 과정이 비정상적으로 종료되었음을 나타냅니다. 이는 SSL/TLS 설정 문제, 네트워크 문제, 또는 클라이언트와 서버 간의 호환성 문제로 인해 발생할 수 있습니다.
에러가 발생하는 상황
- SSL/TLS 핸드셰이크 실패
- SSL/TLS 프로토콜에서는 보안 통신을 시작하기 전에 클라이언트와 서버가 인증서를 교환하고 암호화 방법을 협상합니다.
- 핸드셰이크 중에 클라이언트 또는 서버가 연결을 강제로 종료하면 이 에러가 발생합니다.
- 클라이언트가 연결을 닫음
- 클라이언트가 서버로의 연결을 시작했지만, 핸드셰이크를 완료하지 않고 연결을 닫은 경우.
- 서버 설정 문제
- 서버가 지원하지 않는 SSL/TLS 버전을 클라이언트가 요청했거나, 암호화 스위트가 호환되지 않을 때.
주요 원인
- SSL/TLS 버전 불일치
- 클라이언트와 서버가 지원하는 SSL/TLS 버전이 서로 맞지 않음.
- 예: 클라이언트가 TLS 1.2만 지원하지만 서버가 TLS 1.0만 지원하는 경우.
- 암호화 스위트 문제
- 클라이언트와 서버가 사용하는 암호화 알고리즘(예: Cipher Suite)이 서로 호환되지 않음.
- 인증서 문제
- 서버의 SSL 인증서가 유효하지 않거나 신뢰할 수 없는 인증서.
- 클라이언트가 서버 인증서를 검증하지 못해 연결을 종료.
- 네트워크 문제
- 방화벽, 프록시, 또는 로드밸런서가 SSL/TLS 핸드셰이크를 방해.
- 예: 포트(예: 443)가 차단되어 있거나 패킷이 중단.
- 클라이언트 종료
- 클라이언트가 핸드셰이크 도중 강제로 연결을 닫음.
- 톰캣 SSL 설정 오류
- 톰캣의 server.xml 파일에서 SSL/TLS 설정이 잘못되었거나 누락됨.
해결 방법
1. SSL/TLS 버전 확인
- 클라이언트와 서버가 지원하는 SSL/TLS 버전을 확인하고, 호환되지 않는 버전은 비활성화.
- Tomcat의 server.xml에서 TLS 버전 설정:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"> <SSLHostConfig> <Protocols> <Protocol>TLSv1.2</Protocol> <Protocol>TLSv1.3</Protocol> </Protocols> </SSLHostConfig> </Connector>
2. 암호화 스위트(Cipher Suite) 설정
- 클라이언트와 서버가 공통으로 지원하는 암호화 스위트를 사용.
- Tomcat의 server.xml에서 Cipher 설정:
<SSLHostConfig> <SSLHostConfigCertificate certificateKeystoreFile="conf/keystore.jks" type="RSA" /> <Ciphers> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 </Ciphers> </SSLHostConfig>
3. 인증서 검증
- 서버 인증서가 유효한지 확인:
- 인증서 만료 여부.
- 인증서 체인이 올바르게 구성되었는지.
- 클라이언트에서 서버 인증서를 신뢰할 수 있는지.
- 인증서 갱신:
keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks
4. 방화벽 및 네트워크 설정 확인
- 방화벽, 프록시, 로드밸런서 설정에서 SSL/TLS 트래픽이 차단되지 않았는지 확인.
- Tomcat이 SSL 포트를 열고 있는지 확인:
netstat -an | grep 443
5. 로그 확인
- Tomcat 로그(catalina.out, localhost_access_log.*)와 클라이언트 측 로그를 분석하여 문제 원인을 파악.
6. 클라이언트 호환성 테스트
- 다양한 브라우저 또는 클라이언트를 사용해 서버와의 SSL/TLS 핸드셰이크가 성공하는지 확인.
7. TLS 디버깅 활성화
- Tomcat의 JAVA_OPTS에 디버깅 옵션 추가:
-Djavax.net.debug=ssl:handshake
- 디버깅 로그를 통해 핸드셰이크 실패 원인 분석.
예방 조치
- 최신 TLS 버전 사용
- TLS 1.0 및 1.1은 취약점이 많으므로 비활성화하고 TLS 1.2 이상 사용.
- SSL 인증서 정기 갱신
- Let’s Encrypt, DigiCert 등 신뢰할 수 있는 인증기관(CA)의 인증서 사용.
- 정기적인 보안 점검
- Tomcat과 JDK의 최신 보안 패치를 적용.
- 호환성 테스트
- 다양한 클라이언트와의 통신 시나리오를 테스트하여 문제를 사전에 발견.
결론
"Remote host terminated the handshake" 에러는 주로 SSL/TLS 설정 문제, 인증서 문제, 네트워크 연결 문제로 발생합니다. 위의 해결 방법을 통해 SSL/TLS 설정을 점검하고, 클라이언트와 서버 간의 호환성을 보장하면 문제를 해결할 수 있습니다. 또한 디버깅 옵션을 활용해 원인을 상세히 분석하는 것이 중요합니다.
반응형