자바(Java) & 인텔리제이

도커(Docker) / JDK / MS-SQL / 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: The server selected protocol version TLS10 is not accepted by client preferences [TLS13..

아과노트 2023. 4. 6. 08:00
728x90
반응형

안녕하세요, 

아과노트 입니다.

 

오늘은 JDK 8 이상에서 MS-SQL을 이용해서 DB 접속할 때 종종 발생하는 

 

"드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]"

 

오류에 대한 해결책을 정리해 봅니다.

 

인텔리제이에서 도커 연동

 

결론부터 말씀 드리면 원인은 JDK8 부터 TLS 1.0과 1.1을 보안연결을 비활성화 했기 때문 입니다.

다시말해서 MSSQL의 오래된 버전은 TLS 1.0을 이용해서 보안연결을 할려고 하는데 JDK에서는 TLS 1.0을 비활성화 했기 때문입니다.

 

이를 해결하기 위해서는 JDK의 TLS 1.0, 1.1 비활성화 설정 부분을 제거해 주면 됩니다.

 

보통은 jdk 설치 폴더의 jre/lib/security/java.security에 환경설정 파일이 위치하고 있습니다.

 

java.security 파일을 vi로 열어서

jdk.tls.disabledAlgorithms을 찾습니다.

 

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, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL

 

이렇게 되어 있을텐데요,

여기서 TLSv1, TLSv1.1을 제거해 주면 됩니다.

 

jdk.tls.disabledAlgorithms=SSLv3, 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

 

저장하고 나가면 정상동작하는것을 볼 수 있습니다.

 

일반적으로 JDK는 이렇게 수정 하면 되는데 Docker의 경우 Docker의 이미지 안에 JDK를 수정해야 합니다.

 

이것을 이미지 파일 만들때 수정을 해야 하나 고민을 했는데...

다음과 같은 방법으로 해결하고자 합니다.

 

1. 도커의 JDK의 java.security 파일을 프로젝트 폴더로 가져오기

2. 가져온 java.security를 수정하기

3. Dockerfile에서 수정된 java.security 파일을 도커의 JDK파일에 복사 추가

4. 이미지 빌드

 

이렇게 했을때 위의 문제가 도커의 컨테이너 환경에서 수정이 되었습니다.

 

도움이 되길 바라며 정리해 봅니다.

 

1. 도커의 JDK의 java.security 파일을 프로젝트 폴더로 가져오기

 

먼저 도커의 컨테이너에 접속을 합니다.

하단의 Services > 컨테이너 선택 후 > Terminal을 누릅니다.

그리고 java.security 파일이 있는 폴더로 이동합니다.

참고로 저는 OpenJDK를 eclipse-temurin:17-jdk-alpine을 사용했습니다.

위치는 /opt/java/openjdk/conf/security 입니다.

cd /opt/java/openjdk/conf/security

여기서 cat java.security 로 파일 내용을 읽어 옵니다.

 

여기서 읽어온 부분을 복사해서 프로젝트에 java.security 파일을 만들어서 옮겨 줍니다.

 

2. 가져온 java.security를 수정하기

파일을 옮겼으면 다음과 같이 프로젝트 구조가 생성됩니다.

 

여기서 위에 말한 java.security의 jdk.tls.disabledAlgorithms 부분을 수정합니다.

TLSv1, TLSv1.1을 제거해 주세요

 

3. Dockerfile에서 수정된 java.security 파일을 도커의 JDK파일에 복사 추가

Dockerfile에서 FROM 다음에 다음 구절을 추가해서  java.security 파일을 도커의 JDK파일에 복사합니다.

 

COPY ./java.security /opt/java/openjdk/conf/security/java.security

 

전체 Dockerfile은 다음과 같습니다.

FROM eclipse-temurin:17-jdk-alpine
COPY ./java.security /opt/java/openjdk/conf/security/java.security
ADD ./build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

4. 이미지 빌드

이제 이미지 빌드를 다시 수행합니다.

프로젝트의 Terminal에서 다음과 같이 입력해 주세요

 

 docker build -t agwanote-api:1.0.0 .

 

다음과 같이 되면 성공입니다.

아직 인텔리제이와 도커 컨테이너 환경이 어렵다면

다음글을 참고하면 됩니다.

 

2023.04.04 - [자바(Java) & 인텔리제이] - 인텔리제이(IntelliJ) & 스프링(Spring boot) & 도커(Docker) 연동 / 최종 / 공식문서기준 / 아과노트

 

인텔리제이(IntelliJ) & 스프링(Spring boot) & 도커(Docker) 연동 / 최종 / 공식문서기준 / 아과노트

안녕하세요, 아과노트 입니다! 오늘은 지난 시간에 열심히 구축해 두었던 인텔리제이와 도커 연동에서 실질적으로 스프링(Spring boot) 프로젝트에서 도커로 배포하여 실행하는것 까지 연동해 보

alphalok.tistory.com

 

오늘은 여기까지 입니다.

고생하셨습니다.

728x90
반응형