일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Tibero
- VisualStudioCode
- mac
- TLS1.1
- tlserror
- Oracle
- arm64
- TLSv1
- r진법
- generic i/o error
- tls1.0
- vscode
- Intellj
- u-03
- Java
- Chrony
- Linux
- rocky8.8
- nexacro
- gnu wget
- community server connector
- MacOS
- rocky8
- virtualfile
- 보안조치
- U-06
- JetBrains
- c##
- crownix7
- docker
- Today
- Total
Jit_Log
[JAVA] TLS Protocol Error 본문
들어가기 전
Tomcat에서 꽤 구버전의 MSSQL에 접근하려하니 아래와 같은 오류가 발생했습니다. 이 문제를 해결하며 알게 된 TLS란 무엇이고, 왜 이런 에러가 발생하며 어떻게 해결했는지에 대해 작성하고자 합니다.
실제 적용한 서버 환경은 다음과 같습니다.
서버 환경
Java: JDK 8
WAS: Tomcat9.X
DBMS: SQL Server 2005
TLS란?
TLS(전송 계층 보안)는 컴퓨터 네트워크에서 통신 보안을 제공하는 암호화 프로토콜로, SSL(보안 소켓 계층 프로토콜)이 표준화되면서 변경된 이름입니다. TLS는 SSL3.0의 기초가 되어 배포되었지만, 보안 구조의 차이와 암호화 방식의 변경으로 인해 TLS와 SSL은 상호 운영되지 않습니다. 그러나 SSL과 TLS는 다음과 같은 공통된 보안 기능을 제공합니다.
- 데이터 보호: 도청, 간섭, 위조 방지
- 암호화: 통신의 기밀성과 무결성 보장
- 인증: 서버 및 클라이언트 간 상호 인증 지원
- 신뢰성: 안전한 데이터 교환 가능
다만, TLS는 SSL의 보안 취약점을 보완하고, 더 강력한 암호화 및 인증 방식을 적용한 개선된 프로토콜입니다. 같은 목적을 수행하더라도, TLS는 보다 안전한 방식으로 동작한다고 볼 수 있습니다.
간단하게 TLS 프로토콜에 대해 조사하였고, 자세한 내용은 좀 더 공부하여 추후에 상세히 정리해보도록 하겠습니다.
왜 발생하는가?
"The server selected protocol version TLS10 is not accepted by client preferences TLS12"
JAVA에서 사용하는 TLS 알고리즘과 서버에서 사용하는 인증서 버전이 맞지 않아 발생한 문제라고 합니다.
제가 사용하고 있는 JDK8에서는 TLSv1.2 버전(최신) 이상을 호환하고, TLSv1, TLSv1.1은 예외처리 되어있습니다. MSSQL 2005 에서는 TLSv1 버전을 사용하고 있었고, 이로 인해 MSSQL의 커넥션 풀을 사용할 때 데이터베이스 연결을 생성하지 못하게 되어 오류가 발생하게 되었습니다.
해결 방법
✔️ 서버에서 TLS 버전을 지원하도록 설정
최신 JDBC 드라이버를 사용하면 적용이 됩니다. 하지만 제가 사용한 2005 버전에서는 TLSv1.2를 지원하지 않는다고 합니다. 그래서 위 방법은 사용하지 않았습니다.
✔️ JDK에서 낮은 TLS 버전 허용
java.security 파일에서 TLSv1, TLSv1.1 을 허용하는 방법입니다.
# java.secuurity 파일 검색
fiond / -name java.security
경로를 찾고, 아래 옵션을 찾아 TLSv1, TLSv1.1을 삭제 해줍니다.
# before
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1
# after
jdk.tls.disabledAlgorithms=SSLv3
그 후 서버를 재시작 해주면 정상적으로 커넥션이 되는 것으 확인할 수 있습니다.
✔️ JVM 옵션 수정으로 TLSv1 허용
Tomcat 실행 시 JVM 옵션을 설정해주어 임시적으로 TLSv1 을 허용하는 방법입니다.
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
결론
MSSQL 2005는 TLS 1.2를 지원하지 않으며, 최신 JDBC 드라이버를 사용할 수 없기 때문에 클라이언트(JDK)에서 TLSv1 을 허용하는 방법으로 해결해야 했습니다.
MSSQL 버전을 업그레이드하는 것이 가장 안전한 해결책이지만, 여러 이유로 인해 어쩔 수 없이 JDK에서 TLSv1 을 허용하는 방식(java.security 수정)으로 우회 가능하여 해결하게 되었습니다.
다만, 장기적으로는 MSSQL 업그레이드 또는 TLS 1.2를 지원하는 환경으로 전환하는 것이 가장 안전한 방법입니다.
'IT 공부 > JAVA' 카테고리의 다른 글
[JAVA] Window Java 설치 + 환경변수 세팅하기 (3) | 2024.11.09 |
---|---|
[JAVA] Statement / PreparedStatement / CallableStatement 차이점 (0) | 2022.05.29 |
[Java] 타입변환 - Double타입을 Int타입으로 변환 (0) | 2022.03.04 |
[JAVA] [JSP] input - checkbox 값 여러개 받기 (0) | 2022.03.03 |
[JAVA] 날짜 / 시간 계산하기 (0) | 2022.03.03 |