[SQL Server] 지원하지 않는 TLS 버전 설정
jdk17 버전을 사용하면서 SQL Server 2005 데이터베이스와 통신하려 할 때 오류가 발생했다.
Caused by: cohttp://m.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" 속성이 "false"(으)로 설정되고 "trustServerCertificate" 속성이 "true"(으)로 설정되었지만 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Server에 대한 보안 연결을 설정할 수 없습니다. 오류: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]. ClientConnectionId:6565b020-1960-41a0-be88-050e164d73ef
datasource:
db1:
jdbc-url: jdbc:sqlserver://192.168.10.224:1433;encrypt=true;integratedSecurity=true;trustServerCertificate=true;
username: dbuser
password: 1234
# driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
스프링부트에서 SQL Server를 사용할 때 사용하는 설정이다.
encrypt : 연결을 암호화할지를 결정한다. 서버(SQL Server)는 SSL 인증서를 제공하고, 클라이언트(스프링)는 인증서를 확인한다.
integratedSecurity : Windows 통합 인증 사용 여부를 결정한다. username과 password를 명시해 둔 경우 필요 없는 설정.
trustServerCertificate : 클라이언트가 서버 인증서를 신뢰할지를 결정한다. true로 설정 시 서버 인증서를 검증하지 않는다.
데이터베이스 드라이버는 데이터베이스 서버와 스프링과의 통신을 가능하게 하는 도구로, 연결을 관리하고 쿼리를 실행하는 역할을 수행한다.
log4jdbc는 쿼리 로깅을 지원하는 드라이버로 개발 시 사용하고, microsoft.sqlserver.jdbc 드라이버는 운영 환경에서 사용한다.
DBeaver같은 DB Tool은 내장된 드라이버를 사용해 데이터베이스와 연결할 수 있어 드라이버 설정이 필요 없지만, 스프링같은 애플리케이션에서 데이터베이스에 연결하려면 드라이버 설정이 필요하다.
스프링부트 프로젝트에서는 데이터소스를 2개 사용한다.
(SQL Server 2005 / SQL Server 2019)
Java11 부터는 기본적으로 TLS 1.0과 TLS 1.1을 지원하지 않으니.. Java17 버전을 사용하는 경우 SQL Server 2005와 통신할 수 없다.
2024-06-05 11:42:40.845 [http-nio-0.0.0.0-9090-exec-4] ERROR c.z.h.p.HikariPool - HikariPool-1 - Exception during pool initialization.
com.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" property is set to "false" and "trustServerCertificate" property is set to "true" but the driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption: Error: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]. ClientConnectionId:b19b6e5e-37d1-42d0-a5b2-3ad2e6f41d41
자바 설정파일을 수정해서 TLS 1.0과 TLS 1.1을 지원하도록 수정하자.
WSL에서는 위의 경로에 openjdk가 설치된다.
java.security 파일을 vi로 열고 수정하자.
vi의 / 명령어로 jdk.tls를 검색해 해당 부분에서 TLSv1, TLSv1.1을 삭제 후
:w !sudo tee %> /dev/null 명령어로 변경사항을 저장하자.
변경사항 저장 후에는
2024-06-05 12:04:21.939 [HikariPool-1 connection adder] WARN c.m.s.j.i.T.Channel - TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum.
이렇게 경고가 뜨긴 하지만.. 쿼리는 잘 실행된다.
SQL Server 2005 버전을 최신 버전으로 업데이트하는게 가장 좋지만.. 그게 어려운 경우 자바 설정파일을 조작해 TLS1.0을 활성화하자.
윈도우 서버를 사용하는 경우 관리자 권한으로 수정할 수 있으니 좀 더 쉽게 설정할 수 있다.
java.security의 disableAlgorithms 속성을 변경하는 부분이다.
***
이렇게 하면 문제는 해결되긴 하지만.. 어차피 TLS 문제라면 연결할 때 encrypt=false 값을 줘서 인증서를 사용하지 않게 하면 해결되야 하는거 아닌가?
그런데 encrypt=false로 설정해도 java.security를 조작해 TLS1.0을 지원하도록 설정해 주지 않으면 오류가 발생하던데..
인증서 관련 문제 외에도 jdbc 드라이버 버전 등 여러 부차적인 원인이 있는 것 같다.
'Solutions' 카테고리의 다른 글
[Spring Batch] 메타데이터 테이블과 시퀀스 (0) | 2024.11.05 |
---|---|
[Spring Security] 인증 실패 오류 다루기 (0) | 2024.06.20 |
대용량 파일 업로드 처리 (30GB) (1) | 2023.12.03 |
[JavaScript] Shadow DOM 다루기 (0) | 2023.11.22 |
[Vue] map 함수와 Vue3의 반응형 시스템 (0) | 2023.11.16 |
댓글
이 글 공유하기
다른 글
-
[Spring Batch] 메타데이터 테이블과 시퀀스
[Spring Batch] 메타데이터 테이블과 시퀀스
2024.11.05 -
[Spring Security] 인증 실패 오류 다루기
[Spring Security] 인증 실패 오류 다루기
2024.06.20 -
대용량 파일 업로드 처리 (30GB)
대용량 파일 업로드 처리 (30GB)
2023.12.03 -
[JavaScript] Shadow DOM 다루기
[JavaScript] Shadow DOM 다루기
2023.11.22