SpringBoot 2.7.X 에서 MSSQL jdbc 오류 해결

koreakky·2022년 7월 13일
0

Spring Boot 버전 업

현재 개발중인 프로젝트에서 Spring Boot 2.6.2 버전을 사용중이다.
아직 개발중이고 오픈하지 않은 관계로, Spring Boot 버전을 최신 2.7.1 버전으로 올렸을때
MSSQL jdbc Connection Pool 생성 시 오류가 발생하여 처리했던 경험을 정리하고자 한다.

버전업 후 발생된 오류

com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:87c4c604-92bc-4ee7-92fe-d1e6891e6acc
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3680)
	at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:2113)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3204)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2833)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2671)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1640)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:936)
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    --생략--

드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target".

Spring Boot MS-SQL Gradle 설정

필자는 현재 SpringBoot 설정을 Gradle 로 하고있다.

implementation 'com.microsoft.sqlserver:mssql-jdbc'

별도의 버전을 명시하지 않았기 때문에 Spring Boot 버전에서 최적화된 버전을 자동으로 설정해주는
방식을 사용하고 있다.

Spring Boot Version에 따른 MSSQL Driver 버전

2.6.2


2.6.2 버전에서는 Spring Boot에서 불러온 드라이버 버전이 9.4.1 버전을 가져온다.

2.7.1


2.7.1 버전에서는 10.2.1 버전의 드라이버 라이브러리가 로딩된다.

기존 application.yml 설정

        mssql:
            driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
            jdbc-url: jdbc:sqlserver://localhost:6454;databaseName=TEST

오류가 발생되던 시점에 설정된 jdbc-url 값은 기본적인 설정이다.

원인분석

MSSQL 10.X.X 버전에서 발생된 오류로 보이기 때문에, 뭔가 보안설정등이 바뀐게 아닐까? 라는 생각으로 검색을 해보기 시작했다.

해결방법은 의외로 간단했다.
https://docs.microsoft.com/ko-kr/sql/connect/jdbc/connecting-with-ssl-encryption?view=sql-server-ver16

ms 공식 홈페이지 발췌

MS SQL Server JDBC Driver 10.x.x 부터 TLS1.0과 TLS1.1 이 비활성화 되고 TLS1.2가 활성화 되었다고 한다.

문제해결

MS 가이드를 참고해서 application.yml 설정을 아래와 같이 수정하였다.

mssql:
            driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
            jdbc-url: jdbc:sqlserver://localhost:6454;databaseName=TEST;integratedSecurity=true;encrypt=true;trustServerCertificate=true

integratedSecurity=true;encrypt=true;trustServerCertificate=true

이 설정은 MSSQL 이 TLS 인증서의 유효성을 검사하지 않도록 하는 옵션으로 드라이버 SSL 오류발생 시 우회가 가능한 옵션이다. jdbc-url에 저 옵션을 추가해줌으로써 해당 오류는 더이상 발생되지 않았다.

profile
Web DevOps 밥벌이중..

0개의 댓글