[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
원인
- encrypt=false 는 최초 로그인 이후 데이터의 통신에만 영향이 있으며 설정과는 무관하게 최초 로그인 시 SSL 연결을 시도함
- 이 때 SSL 에는 JAVA 의 기본 security 설정을 사용함
- JAVA 버전에 따라 오래된 SSL 알고리즘(TLSv1 등) 은 기본적으로 비활성화 되어있음
- Custom JAVA security 설정을 사용해 SSL 보안수준을 낮출 수 있음
해결방법
-
Custom JAVA security 설정 수정
- 보통 /usr/lib/jvm/jre/lib/security/java.security 경로에 있음
-
아래와 같이 설정을 수정
-
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
-
-
다 수정했다면 tomcat 재기동
주의사항
- 위 설정은 보안적으로 취약한 TLS 알고리즘을 활성화 하여 사용하므로 보안성이 취약해질 수 있다는 점을 인지하고 적용하자
- MSSQL 인증서가 최신버전이라면 되도록 encrypt=true 로 연결하자