이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[SQL Server] 지원하지 않는 TLS 버전 설정

  • 2024.06.05 23:09
  • 💡 솔루션
반응형

 

 

 

 

jdk17 버전을 사용하면서 SQL Server 2005 데이터베이스와 통신하려 할 때 오류가 발생했다.

 

 

Caused by: http://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 드라이버 버전 등 여러 부차적인 원인이 있는 것 같다. 

 

2026.1.13 추가

 

 

음 찾아보니 SQL Server와 JDBC 드라이버는 Tabular Data Stream 프로토콜을 사용하는데

이 프로토콜의 보안 매커니즘을 분석해야 함. 

 

Pre-Login : 클라와 서버가 버전 / 쓰레드 정보 / 암호화 지원 정보 등을 교환함

TLS Handshake & Login : 암호화 협상 및 사용자 인증 

Data Exchange : 쿼리 실행 및 데이터 반환 

 

encrypt를 false로 설정하더라도 로그인 패킷은 암호화 해야 함.

 

Pre-Login 패킷을 서버로 보내는데, 이 때 encrypt=false로 설정했으니 평문으로 하겠다고 하는건데..

SQL Server는 요청을 받아 데이터 교환은 평문으로 하되 로그인 패킷은 암호화하라고 응답함.

 

드라이버는 서버 응답을 확인하고 로그인 패킷을 암호화 하기 위해 TLS 버전을 합의한다.

여기서 문제가 터지는거임. JDK 17은 TLS 1.0/1.1 을 안쓰는데 SQL Server 2005는 TLS 1.0만 지원한다.

 

그러니.. SQL Server 2005에서 사이드패치를 통해 TLS 1.2를 지원하게 하는게 좋음. 근데 찾아보니 거의 불가능하다고 함; 

성능 안나오더라도 보안 챙기려면 Linked Server 써야 할듯... 프록시 써도 괜찮아보이고.. 

 

 

 

 

반응형
저작자표시 (새창열림)

'💡 솔루션' 카테고리의 다른 글

[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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (675) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (8)
    • 💬 기록 (7) N
    • 📚 공부 (5)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바