카테고리 없음

"Remote host terminated the handshake" 톰캣 에러 분석

idea9329 2024. 12. 6. 16:59
반응형

 

"Remote host terminated the handshake"는 Tomcat 서버에서 SSL/TLS 통신 중 발생하는 에러로, 클라이언트와 서버 간의 SSL/TLS 핸드셰이크(handshake) 과정이 비정상적으로 종료되었음을 나타냅니다. 이는 SSL/TLS 설정 문제, 네트워크 문제, 또는 클라이언트와 서버 간의 호환성 문제로 인해 발생할 수 있습니다.


에러가 발생하는 상황

  1. SSL/TLS 핸드셰이크 실패
    • SSL/TLS 프로토콜에서는 보안 통신을 시작하기 전에 클라이언트와 서버가 인증서를 교환하고 암호화 방법을 협상합니다.
    • 핸드셰이크 중에 클라이언트 또는 서버가 연결을 강제로 종료하면 이 에러가 발생합니다.
  2. 클라이언트가 연결을 닫음
    • 클라이언트가 서버로의 연결을 시작했지만, 핸드셰이크를 완료하지 않고 연결을 닫은 경우.
  3. 서버 설정 문제
    • 서버가 지원하지 않는 SSL/TLS 버전을 클라이언트가 요청했거나, 암호화 스위트가 호환되지 않을 때.

주요 원인

  1. SSL/TLS 버전 불일치
    • 클라이언트와 서버가 지원하는 SSL/TLS 버전이 서로 맞지 않음.
    • 예: 클라이언트가 TLS 1.2만 지원하지만 서버가 TLS 1.0만 지원하는 경우.
  2. 암호화 스위트 문제
    • 클라이언트와 서버가 사용하는 암호화 알고리즘(예: Cipher Suite)이 서로 호환되지 않음.
  3. 인증서 문제
    • 서버의 SSL 인증서가 유효하지 않거나 신뢰할 수 없는 인증서.
    • 클라이언트가 서버 인증서를 검증하지 못해 연결을 종료.
  4. 네트워크 문제
    • 방화벽, 프록시, 또는 로드밸런서가 SSL/TLS 핸드셰이크를 방해.
    • 예: 포트(예: 443)가 차단되어 있거나 패킷이 중단.
  5. 클라이언트 종료
    • 클라이언트가 핸드셰이크 도중 강제로 연결을 닫음.
  6. 톰캣 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
  • 디버깅 로그를 통해 핸드셰이크 실패 원인 분석.

예방 조치

  1. 최신 TLS 버전 사용
    • TLS 1.0 및 1.1은 취약점이 많으므로 비활성화하고 TLS 1.2 이상 사용.
  2. SSL 인증서 정기 갱신
    • Let’s Encrypt, DigiCert 등 신뢰할 수 있는 인증기관(CA)의 인증서 사용.
  3. 정기적인 보안 점검
    • Tomcat과 JDK의 최신 보안 패치를 적용.
  4. 호환성 테스트
    • 다양한 클라이언트와의 통신 시나리오를 테스트하여 문제를 사전에 발견.

결론

"Remote host terminated the handshake" 에러는 주로 SSL/TLS 설정 문제, 인증서 문제, 네트워크 연결 문제로 발생합니다. 위의 해결 방법을 통해 SSL/TLS 설정을 점검하고, 클라이언트와 서버 간의 호환성을 보장하면 문제를 해결할 수 있습니다. 또한 디버깅 옵션을 활용해 원인을 상세히 분석하는 것이 중요합니다.

반응형