๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๊ณผ์ • ์ƒ์„ธ ๋ถ„์„: ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ํ•ต์‹ฌ ์ดํ•ดํ•˜๊ธฐ

mrmount 2024. 10. 18.

 

 

 

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๋Š” ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ €)์™€ ์„œ๋ฒ„๊ฐ€ ์•ˆ์ „ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ • ์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์–‘์ธก์€ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๊ตํ™˜ ํ•˜๊ณ , ์ธ์ฆ์„œ ๊ฒ€์ฆ ์„ ํ†ตํ•ด ์‹ ๋ขฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. SSL ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋œ ์ฑ„๋„ ์„ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

 


 

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๋‹จ๊ณ„๋ณ„ ๊ณผ์ •

SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋Œ€์นญํ‚ค ์™€ ๋น„๋Œ€์นญํ‚ค ๋ฅผ ํ™œ์šฉํ•ด ์•ˆ์ „ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ ์„ค๋ช…
1. Client Hello ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ณด๋ƒ„
2. Server Hello ์„œ๋ฒ„๊ฐ€ ์ง€์› ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์‹œ
3. ์ธ์ฆ์„œ ์ „๋‹ฌ ์„œ๋ฒ„๊ฐ€ SSL ์ธ์ฆ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก
4. ํ‚ค ๊ตํ™˜ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ํ‚ค๋ฅผ ๊ตํ™˜
5. ํ•ธ๋“œ์…ฐ์ดํฌ ์™„๋ฃŒ ์•”ํ˜ธํ™”๋œ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ์ž‘



์˜ˆ์ œ ์ฝ”๋“œ: SSL ํ•ธ๋“œ์…ฐ์ดํฌ ํ๋ฆ„(ํŒŒ์ด์ฌ ssl ๋ชจ๋“ˆ ์‚ฌ์šฉ)

import ssl

import socket

hostname = 'example.com'

context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:

    with context.wrap_socket(sock, server_hostname=hostname) as ssock:

        print(f"SSL Established. Protocol: {ssock.version()}")

 

 

SSL ํ•ธ๋“œ์…ฐ์ดํฌ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๋Š” ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ €)์™€ ์„œ๋ฒ„๊ฐ€ ์•ˆ์ „ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ • ์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์–‘์ธก์€ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๊ตํ™˜ ํ•˜๊ณ , ์ธ์ฆ์„œ ๊ฒ€์ฆ ์„ ํ†ตํ•ด ์‹ ๋ขฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. SSL ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋œ ์ฑ„๋„ ์„ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

 


 

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๋‹จ๊ณ„๋ณ„ ๊ณผ์ •

SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋Œ€์นญํ‚ค ์™€ ๋น„๋Œ€์นญํ‚ค ๋ฅผ ํ™œ์šฉํ•ด ์•ˆ์ „ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ ์„ค๋ช…
1. Client Hello ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ณด๋ƒ„
2. Server Hello ์„œ๋ฒ„๊ฐ€ ์ง€์› ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์‹œ
3. ์ธ์ฆ์„œ ์ „๋‹ฌ ์„œ๋ฒ„๊ฐ€ SSL ์ธ์ฆ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก
4. ํ‚ค ๊ตํ™˜ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ํ‚ค๋ฅผ ๊ตํ™˜
5. ํ•ธ๋“œ์…ฐ์ดํฌ ์™„๋ฃŒ ์•”ํ˜ธํ™”๋œ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ์ž‘



์˜ˆ์ œ ์ฝ”๋“œ: SSL ํ•ธ๋“œ์…ฐ์ดํฌ ํ๋ฆ„(ํŒŒ์ด์ฌ ssl ๋ชจ๋“ˆ ์‚ฌ์šฉ)

import ssl

import socket

hostname = 'example.com'

context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:

    with context.wrap_socket(sock, server_hostname=hostname) as ssock:

        print(f"SSL Established. Protocol: {ssock.version()}")

์„ค๋ช…: ์ด ์ฝ”๋“œ๋Š” Python์˜ ssl ๋ชจ๋“ˆ ์„ ์‚ฌ์šฉํ•ด SSL ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์—ฐ๊ฒฐ๋œ ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 


 

๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค์˜ ์‚ฌ์šฉ

 

๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

์ดˆ๊ธฐ ํ•ธ๋“œ์…ฐ์ดํฌ ๋‹จ๊ณ„์—์„œ๋Š” ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- ๊ณต๊ฐœํ‚ค(Public Key) : ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค
- ๊ฐœ์ธํ‚ค(Private Key) : ์„œ๋ฒ„๋งŒ์ด ๋ณด์œ ํ•œ ํ‚ค

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™” ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ž์‹ ์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋Š” ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- ๋Œ€์นญํ‚ค ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๊ฐ™์€ ํ‚ค ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
- ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 


 

์ธ์ฆ์„œ ๊ฒ€์ฆ ๊ณผ์ •

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— SSL ์ธ์ฆ์„œ ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ธ์ฆ์„œ ์œ ํšจ์„ฑ ํ™•์ธ : ์ธ์ฆ์„œ์˜ ๋งŒ๋ฃŒ ๋‚ ์งœ์™€ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์ฆ ๊ธฐ๊ด€(CA) ์‹ ๋ขฐ ์—ฌ๋ถ€ : ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•œ CA๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฒด์ธ ๊ฒ€์ฆ : ์ค‘๊ฐ„ ์ธ์ฆ์„œ์™€ ๋ฃจํŠธ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐ ์ฒด์ธ ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ: OpenSSL์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ์„œ ํ™•์ธ

openssl s_client -connect example.com:443

์„ค๋ช…: ์ด ๋ช…๋ น์–ด๋Š” OpenSSL ๋„๊ตฌ ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•˜๊ณ , ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 


 

์ตœ์‹  SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ ํŠธ๋ Œ๋“œ

  • TLS 1.3 ์€ ํ•ธ๋“œ์…ฐ์ดํฌ ๊ณผ์ •์ด ๋‹จ์ˆœํ™”๋˜์–ด ์†๋„๊ฐ€ 50% ์ด์ƒ ๊ฐœ์„  ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์›น์‚ฌ์ดํŠธ๋Š” ์ด์ œ TLS 1.2 ์ด์ƒ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ๊ธ€ ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค ๋Š” TLS 1.0๊ณผ 1.1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

 


 

FAQ

Q1. SSL ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
A1. ์„œ๋ฒ„ ์„ค์ •์„ ํ™•์ธํ•˜๊ณ  ์ธ์ฆ์„œ ๋งŒ๋ฃŒ ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

Q2. TLS 1.2์™€ TLS 1.3์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
A2. TLS 1.3 ์€ ํ•ธ๋“œ์…ฐ์ดํฌ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๋ณด์•ˆ์ด ๊ฐ•ํ™” ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Q3. ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
A3. ์ดˆ๊ธฐ ํ•ธ๋“œ์…ฐ์ดํฌ์—๋Š” ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ดํ›„ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋กœ ์ „ํ™˜ํ•ด ์†๋„์™€ ๋ณด์•ˆ ์„ ๋ชจ๋‘ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

Q4. SSL ์ธ์ฆ์„œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋‚˜์š”?
A4. ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•  ๋•Œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ๋ฅผ ๋ณด๊ฒŒ ๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ดํƒˆ๋ฅ ์ด ์ฆ๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q5. TLS ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
A5. OpenSSL ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ฉด TLS ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

openssl s_client -connect example.com:443

 


๋Œ“๊ธ€