2 min read

[MSSQL] 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "Unexpected rethrowing"

구동환경

  • JAVA 1.8.0
  • Spring Boot
  • Tomcat 8.5
  • MSSQL

에러메시지

Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "Unexpected rethrowing".

현상분석

  • DB 접속 시 SSL 인증 활성화로 인해 오류가 발생함
  • MSSQL 접속 시 encrypt=false 로 설정하였으나 여전히 연결실패함
jdbc:sqlserver://호스트이름;databaseNAme=데이터베이스이름;encrypt=false

원인

  1. encrypt=false 는 최초 로그인 이후 데이터의 통신에만 영향이 있으며 설정과는 무관하게 최초 로그인 시 SSL 연결을 시도함
  2. 이 때 SSL 에는 JAVA 의 기본 security 설정을 사용함
  3. JAVA 버전에 따라 오래된 SSL 알고리즘(TLSv1 등) 은 기본적으로 비활성화 되어있음
  4. Custom JAVA security 설정을 사용해 SSL 보안수준을 낮출 수 있음

해결방법

  1. Custom JAVA security 설정 수정

    • 보통 /usr/lib/jvm/jre/lib/security/java.security 경로에 있음
  2. 아래와 같이 설정을 수정

    • JAVA 기본 설정이 아닌 커스텀 설정을 사용하도록 변경
      security.useSystemPropertiesFile=false

    • TLSv1, TLSv1.1 암호화 활성화
      jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA

    • 특정 문제되는 TLS 인증서 비활성화
      jdk.security.caDistrustPolicies=SYMANTEC_TLS,ENTRUST_TLS

  3. 다 수정했다면 tomcat 재기동

주의사항

  • 위 설정은 보안적으로 취약한 TLS 알고리즘을 활성화 하여 사용하므로 보안성이 취약해질 수 있다는 점을 인지하고 적용하자
  • MSSQL 인증서가 최신버전이라면 되도록 encrypt=true 로 연결하자