์Šคํ”„๋ง(Java21)์—์„œ DB ์—ฐ๊ฒฐ์— ์‹คํŒจํ•œ ์ด์œ , TLS ํ˜‘์ƒ ์‹คํŒจ ์›์ธ ํŒŒํ•ด์น˜๊ธฐ

ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๋Š” Spring Boot 3.x / Java 21 ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ณ ๊ฐ์‚ฌ ์„ค๋น„์— ์žˆ๋Š” ๋ ˆ๊ฑฐ์‹œ DB(MS-SQL)์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ–ˆ๋‹ค.

 

๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด DB๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ผ์‹œ์ ์œผ๋กœ๋งŒ ์ ‘์†ํ•˜๋Š” ์™ธ๋ถ€ ์„ค๋น„ DB์˜€๋‹ค. 

 

 

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ์™€ ์—๋Ÿฌ ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

Connection conn = DriverManager.getConnection(url, props);

 

Caused by: javax.net.ssl.SSLHandshakeException: (protocol_version) The server selected protocol version TLS10 
is not accepted by client preferences [TLS13, TLS12]

"encrypt" ์†์„ฑ์ด "true"(์œผ)๋กœ ์„ค์ •๋˜๊ณ  "trustServerCertificate" ์†์„ฑ์ด "true"(์œผ)๋กœ ์„ค์ •๋˜์—ˆ์ง€๋งŒ 
๋“œ๋ผ์ด๋ฒ„๊ฐ€ SSL(Secure Sockets Layer) ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL Server์— ๋Œ€ํ•œ 
๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜: (protocol_version) The server selected protocol 
version TLS10 is not accepted by client preferences [TLS13, TLS12]. 
ClientConnectionId:3221cd32-88b8-4f41-96fa-222c5f8081a0

 

 

 

์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹จ์ˆœํ•œ JDBC ์˜ค๋ฅ˜๋‚˜ ๊ณ„์ • ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

"The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]"

์„œ๋ฒ„(MSSQL)๋Š” TLS 1.0์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ํด๋ผ์ด์–ธํŠธ(Java 21)๋Š” TLS 1.2์™€ TLS 1.3๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

์ด๋Š” DB์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ TLS Handshake ๋‹จ๊ณ„์—์„œ ํ˜‘์ƒ์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด TLS Handshake๋Š” ๋ญ๊ธธ๋ž˜, ์™œ ํ˜‘์ƒ์— ์‹คํŒจํ•œ๊ฑธ๊นŒ?

 

 

 

 

 

 

 

 

 

TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋ž€

TLS(Transport Layer Security) ํ•ธ๋“œ์…ฐ์ดํฌ๋Š”ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์•ˆ์ „ํ•œ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋กœ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ํ•ฉ์˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

 

 

์ฆ‰, ์„œ๋กœ

  • ์–ด๋–ค TLS ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ์ง€
  • ์–ด๋–ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ• ์ง€
  • ์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ฒด์ธ์ง€
  • ์–ด๋–ป๊ฒŒ ์„ธ์…˜ ํ‚ค๋ฅผ ์ƒ์„ฑํ• ์ง€

๋“ฑ์„ ํ˜‘์ƒํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ํ†ต์‹  ์ฑ„๋„์„ ๋งŒ๋“œ๋Š” ์ ˆ์ฐจ๋‹ค. ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ดํ›„์˜ ๋ฐ์ดํ„ฐ(์ฟผ๋ฆฌ, ํŒจํ‚ท)๋Š” ๋ชจ๋‘ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์ „์†ก๋˜๋ฉฐ, ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์—ฐ๊ฒฐ ์ž์ฒด๋ฅผ ์„ฑ๋ฆฝ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.์ด๋ฒˆ ๋ฌธ์ œ์ฒ˜๋Ÿผ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” TLS ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉด ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ฐ”๋กœ ์ค‘๋‹จ๋œ๋‹ค.

 

 

 

TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ClientHello

ํด๋ผ์ด์–ธํŠธ(Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๊ฐ€ ์„œ๋ฒ„(DB)์— ๋ณด๋‚ด๋Š” ์ฒซ ๋ฉ”์‹œ์ง€๋‹ค.
์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” TLS ๋ฒ„์ „ ๋ชฉ๋ก (ex: TLS1.3, TLS1.2)
  • ์ง€์›ํ•˜๋Š” ์•”ํ˜ธ ์ œํ’ˆ๊ตฐ
  • "ํด๋ผ์ด์–ธํŠธ ๋ฌด์ž‘์œ„" ๋ผ๊ณ  ํ•˜๋Š” ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด

์ฆ‰, “๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” TLS ์˜ต์…˜์€ ์ด๊ฑฐ์•ผ. ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜ ๊ณจ๋ผ์ค˜.” ๋ผ๋Š” ๋ฉ”์‹œ์ง€์ด๋‹ค.

 

2. ServerHello

์„œ๋ฒ„(MSSQL)๊ฐ€ ClientHello์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋‹ค.

ํฌํ•จ๋˜๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ TLS ๋ฒ„์ „
  • ์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ ์•”ํ˜ธ ์ œํ’ˆ๊ตฐ
  • "์„œ๋ฒ„ ๋ฌด์ž‘์œ„" ๋ผ๊ณ  ํ•˜๋Š” ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด

์ด ๋ฉ”์‹œ์ง€๋Š” “๊ทธ๋Ÿผ ์šฐ๋ฆฌ ์ด ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•˜์ž.”๋ผ๋Š” ์˜๋ฏธ๋‹ค. ์—ฌ๊ธฐ์„œ ํ˜‘์ƒ ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต ๋ฒ„์ „์ด ์—†์œผ๋ฏ€๋กœ ํ˜‘์ƒ์ด ์ฆ‰์‹œ ๊นจ์ง„๋‹ค.

 

3. ์„œ๋ฒ„ ์ธ์ฆ (Certificate)

์„œ๋ฒ„๋Š” SSL/TLS ์ธ์ฆ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ CA(์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€)๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•œ๋‹ค.

์ด ๊ณผ์ •์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๊ฐ€ ์ •๋ง ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. (์ค‘๊ฐ„์ž ๊ณต๊ฒฉ ๋ฐฉ์ง€)

 

 

 

4. ์˜ˆ๋น„ ๋งˆ์Šคํ„ฐ ์•”ํ˜ธ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์˜ˆ๋น„ ๋งˆ์Šคํ„ฐ ์•”ํ˜ธ"๋ผ๊ณ  ํ•˜๋Š” ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜ ๋” ์ „์†กํ•œ๋‹ค. ์˜ˆ๋น„ ๋งˆ์Šคํ„ฐ ์•”ํ˜ธ๋Š” ๊ณต๊ฐœ ํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ๊ฐœ์ธ ํ‚ค๋กœ๋งŒ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, ์„œ๋ฒ„๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. 

 

 

5. ์„ธ์…˜ ํ‚ค ์ƒ์„ฑ

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ํด๋ผ์ด์–ธํŠธ ๋ฌด์ž‘์œ„, ์„œ๋ฒ„ ๋ฌด์ž‘์œ„, ์˜ˆ๋น„ ๋งˆ์Šคํ„ฐ ์•”ํ˜ธ๋ฅผ ์ด์šฉํ•ด ์„ธ์…˜ ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•œ๋‹ค.

 

์ด ํ‚ค๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ(์ฟผ๋ฆฌ, ํŒจํ‚ท)๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

6. ์ค€๋น„ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ๊ตํ™˜

์–‘์ชฝ์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์„ธ์…˜ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ “Finished” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์˜ค๊ฐ€๋Š” ์ˆœ๊ฐ„, ์–‘์ชฝ์ด ๋™์ผํ•œ ์„ธ์…˜ํ‚ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.

 

 

 

7. ์ดํ›„ ๋ชจ๋“  ํ†ต์‹ ์€ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋กœ ์ง„ํ–‰

ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ดํ›„์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ์„ธ์…˜ํ‚ค ๊ธฐ๋ฐ˜ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋กœ ํ†ต์‹ ํ•œ๋‹ค.

 

์ด์ œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์˜ค๊ฐ€๋ฉฐ, ์„œ๋ฒ„ ์ธ์ฆ·๋Œ€์นญํ‚ค ์ƒ์„ฑ ๋“ฑ ์ดˆ๊ธฐ ์ ˆ์ฐจ๋Š” ์™„๋ฃŒ๋œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

 

 

 

 

TLS ๋””๋ฒ„๊น…์œผ๋กœ ํ™•์ธํ•œ ์‹คํŒจ ์›์ธ

๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด JVM TLS ๋””๋ฒ„๊น… ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค. 

 

๋””๋ฒ„๊น… ๋กœ๊ทธ ์ค‘ ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์™”๋‹ค.

// ClientHello
javax.net.ssl|DEBUG|10|main|2025-11-19 09:54:15.815 KST|ClientHello.java:638|Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.2",
  "random"              : "7873D62EDDA41CB6A64B675438E25EE74CB13A7913AC9DA352C7A916B25D3917",
  "session id"          : "B03D93EACCCC2B6E05A289013EFFE55C51554EFB4D59683FB35CFABBECD63497",
  "cipher suites"       : "[TLS_AES_256_GCM_SHA384(0x1302), TLS_AES_128_GCM_SHA256(0x1301), TLS_CHACHA20_POLY1305_SHA256(0x1303), TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA9), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA8), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCAA), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]",
  "compression methods" : "00",
  "extensions"          : [
    "status_request (5)": {
      "certificate status type": ocsp
      "OCSP status request": {
        "responder_id": <empty>
        "request extensions": {
          <empty>
        }
      }
    },
    "supported_groups (10)": {
      "named groups": [x25519, secp256r1, secp384r1, secp521r1, x448, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]
    },
    "ec_point_formats (11)": {
      "formats": [uncompressed]
    },
    "status_request_v2 (17)": {
      "cert status request": {
        "certificate status type": ocsp_multi
        "OCSP status request": {
          "responder_id": <empty>
          "request extensions": {
            <empty>
          }
        }
      }
    },
    "extended_master_secret (23)": {
      <empty>
    },
    "session_ticket (35)": {
      <empty>
    },
    "signature_algorithms (13)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, ed25519, ed448, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "supported_versions (43)": {
      "versions": [TLSv1.3, TLSv1.2]
    },
    "psk_key_exchange_modes (45)": {
      "ke_modes": [psk_dhe_ke]
    },
    "signature_algorithms_cert (50)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, ed25519, ed448, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "key_share (51)": {
      "client_shares": [  
        {
          "named group": x25519
          "key_exchange": {
            0000: DF 98 1D 9F D8 91 B6 D5   20 13 F8 9F FD 3B FC B8  ........ ....;..
            0010: 73 84 08 DF 79 97 19 CC   E2 D8 95 3D C6 D9 8B 5A  s...y......=...Z
          }
        },
        {
          "named group": secp256r1
          "key_exchange": {
            0000: 04 B0 ED F5 A3 CC 3B 83   D1 03 FA 8D FB B7 18 63  ......;........c
            0010: DB 53 99 BE 8C 34 17 7C   4F 20 92 1F 4C A5 EC 2E  .S...4..O ..L...
            0020: 72 DB DA 28 8E 43 16 64   7F AC 76 22 2C 1C 2A 5D  r..(.C.d..v",.*]
            0030: 6F 7C B7 FA 16 B6 2E 6E   86 F1 BD E3 03 7A 98 42  o......n.....z.B
            0040: 35 
          }
        },
      ]
    }
  ]
}
)

// ServerHello
javax.net.ssl|DEBUG|10|main|2025-11-19 09:54:15.818 KST|ServerHello.java:878|Consuming ServerHello handshake message (
"ServerHello": {
  "server version"      : "TLSv1",
  "random"              : "691D1537A4E341DA6FA84374F85AE0B8FE61F53A3D29CAEC73563AAE56062CA2",
  "session id"          : "280A00007D19AC786D99DA77E77B849113DA77011E8BB4FB1973DE5D959F7AC6",
  "cipher suite"        : "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014)",
  "compression methods" : "00",
  "extensions"          : [
    "extended_master_secret (23)": {
      <empty>
    },
    "renegotiation_info (65,281)": {
      "renegotiated connection": [<no renegotiated connection>]
    }
  ]
}
)

 

 

CLIENT HELLO

ClientHello ๋ฉ”์‹œ์ง€์—๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ “๋‚ด๊ฐ€ ์ง€์›ํ•˜๋Š” TLS ๋ฒ„์ „์€ ์ด๊ฑฐ์•ผ”๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค.

๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด Java 21์€ ์ด๋ ‡๊ฒŒ ๋งํ•œ๋‹ค.

"supported_versions (43)": {
  "versions": [TLSv1.3, TLSv1.2]
}

 

 

SERVER HELLO

๋ฐ˜๋ฉด MSSQL 2008์˜ ServerHello๋Š” MSSQL 2008์€ TLS 1.0๋งŒ ์ง€์›ํ•œ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์‘๋‹ตํ•œ๋‹ค.

"server version" : "TLSv1"

 

 

 

 

 

 

 

 

 

 

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์— ์„œ๋กœ ์š”๊ตฌํ•˜๋Š” TLS ๋ฒ„์ „์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋งŒ ๋งž์ถฐ์ฃผ๋ฉด ๋œ๋‹ค. 

 

  • ์„œ๋ฒ„ ์ชฝ์„ ์˜ฌ๋ ค์„œ(TLS1.2 ์ด์ƒ ์ง€์›ํ•˜๋„๋ก) ๋งž์ถฐ์ค€๋‹ค.
    • MSSQL ๋ฒ„์ „ ์—…, OS ํŒจ์น˜, TLS ์„ค์ • ์กฐ์ • ๋“ฑ
    • ๋ณด์•ˆ์ ์œผ๋กœ๋„ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ํ•ด๋ฒ•
  • ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ TLS1.0๋„ ๋‹ค์‹œ ํ—ˆ์šฉํ•ด์ค€๋‹ค.
    • JDK ๋ณด์•ˆ ์ •์ฑ…์„ ์™„ํ™”

 

 

๊ณ ๊ฐ์‚ฌ ์„ค๋น„๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜๋Š” ์—†๋Š” ์ƒํ™ฉ์ด์—ˆ๊ธฐ์— ์ž„์˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์ชฝ์—์„œ TLS 1.0์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. 

 

Java ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ java.security ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ •์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค. 

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, DTLSv1.0, ...

 

 

์—ฌ๊ธฐ์„œ TLSv1์„ ์ œ๊ฑฐํ–ˆ๊ณ  ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Dockerfile์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. 

RUN sed -i 's|^jdk.tls.disabledAlgorithms=.*|jdk.tls.disabledAlgorithms=SSLv3, DTLSv1.0, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, ECDH|' /opt/java/openjdk/conf/security/java.security

 

์ด๋ ‡๊ฒŒ ๋ฌด์‚ฌํžˆ(?) ๊ณ ๊ฐ์‚ฌ์˜ ํ”„๋ ˆ๊ฑฐ์‹œDB์— ์ž˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

 

ํ•˜์ง€๋งŒ

TLSv1์€ ์ด๋ฏธ ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋ฏธ ์—ฌ๋Ÿฌ ๊ฐ์ข… ๊ฐ€์ด๋“œ๋ผ์ธ์— "์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ"์ด๋ผ๊ณ  ๊ถŒ์žฅ๋˜๊ณ  ์žˆ๋‹ค. 

 

 

ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐฐํฌ๋  ๊ณณ์€ ๋‚ด๋ถ€๋ง์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์„ ํƒ์„ ํ–ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น TLS 1.0 ์—ฐ๊ฒฐ์€ ํŠน์ • ์„ค๋น„ DB์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์ผํšŒ์„ฑ ์—ฐ๊ฒฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์Šคํฌ๊ฐ€ ๋น„๊ต์  ์ œํ•œ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.