회사에서 MsSQL을 TMS 전용 DB로 사용하고 있는데, 과거에는 자바 프로젝트를 사용하지 않고 Visual Basic으로 진행하여 큰 문제가 없었다.
이번 기회에 vb로 작성된 코드들을 자바로 옮기기로 하였고, 그 과정에서 TMS에 데이터를 삽입하는 과정에서 아래의 오류가 터졌다.
Caused by: javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:365)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:312)
at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.onServerHello(ServerHello.java:972)
at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.consume(ServerHello.java:894)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:396)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:480)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:458)
at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:201)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1421)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1853)
... 73 common frames omitted
원인
해당 오류는 우리 DB인 MsSQL 서버의 TLS와 Java17의 TLS 버전이 다르다는 것이다.
서버에서는 TLS 1.0을 사용하고 싶어하지만, Java17은 TLS 1.2 이상 버전을 요구한다.
찾아보니 아래와 같은 자바 버전을 사용 중이라면 모두 TLS 1.2 이상을 사용해야한다.
버전릴리스 번호
오픈JDK 8 | 8u292 이상 |
오픈JDK 11 | 11.0.11 이상 |
OpenJDK 16 이상 | 모든 버전 |
해결
우리가 사용하고 있는 Java 폴더에 java.security 파일이 있다.
해당 파일에서 disable하고 있는 TLS 버전을 지워주면 된다.
윈도우 기준으로 아래의 경로에 있었다. Java17기준이다.
C:\Program Files\Java\jdk-17\conf\security
위 경로에서 java.security를 메모장으로 열어준 후, jdk.tls.disabledAlgorithms 라는 항목을 검색해보면 뒤에 나열되어 있는 것들 중 TLSv1과 TLSv1.1이 보인다. 여기서 TLSv1과 TLSv1.1을 지워주자.
수정 전
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
수정 후
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
그리고 저장한 후, 다시 실행해보면 위와 같은 오류는 사라진 것을 확인할 수 있을 것이다.
'Error Record' 카테고리의 다른 글
ConcurrentModificationException이 발생하지 않는 경우 (2) | 2024.04.09 |
---|---|
[Makefile] 오류, *** 분리 기호가 빠졌음. 멈춤 해결 방법 (1) | 2023.12.05 |
The designated data directory /var/lib/mysql/ is unusable. (0) | 2023.11.16 |
AttributeError: Can't get attribute (0) | 2023.09.08 |
MySQL Workbench 튕김 현상 해결 (0) | 2023.08.30 |