Search

SSL

SSL/TLS ์ธ์ฆ์„œ

๊ฐœ์š”

SSL ์ธ์ฆ์„œ๋Š” ์›น ์„œ๋ฒ„์˜ ์‹ ์›์„ ๋ณด์ฆํ•˜๊ณ  ์•”ํ˜ธํ™” ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ „์ž ๋ฌธ์„œ์ด๋‹ค. ํ˜„์žฌ๋Š” SSL์˜ ํ›„์† ๋ฒ„์ „์ธ TLS๊ฐ€ ํ‘œ์ค€์ด์ง€๋งŒ, ๊ด€๋ก€์ ์œผ๋กœ "SSL ์ธ์ฆ์„œ"๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
SSL ์ธ์ฆ์„œ๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ์›น ์„œ๋ฒ„์˜ ์‹ ๋ถ„์ฆ์ด์—์š”. ์šฐ๋ฆฌ๊ฐ€ ์€ํ–‰์— ๊ฐ€๋ฉด ์ง์›์ด ๋ช…์ฐฐ์„ ๋‹ฌ๊ณ  ์žˆ์ž–์•„์š”? ๊ทธ๊ฑธ ๋ณด๊ณ  "์•„, ์ด ์‚ฌ๋žŒ์ด ์ง„์งœ ์€ํ–‰ ์ง์›์ด๊ตฌ๋‚˜" ํ•˜๊ณ  ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, SSL ์ธ์ฆ์„œ๋ฅผ ๋ณด๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ "์ด ์„œ๋ฒ„๊ฐ€ ์ง„์งœ google.com์ด๊ตฌ๋‚˜" ํ•˜๊ณ  ์‹ ๋ขฐํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐ€์งœ google.com์„ ๋งŒ๋“ค์–ด๋„, ์ •์‹ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ "์ด๊ฑฐ ๊ฐ€์งœ์•ผ! ์œ„ํ—˜ํ•ด!" ํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ ๋„์›Œ์ฃผ๋Š” ๊ฑฐ์ฃ .

SSL์—์„œ TLS๋กœ์˜ ๋ณ€์ฒœ์‚ฌ

๋ฒ„์ „
์—ฐ๋„
์ƒํƒœ
๋น„๊ณ 
SSL 1.0
1994
๋ฏธ๊ณต๊ฐœ
์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ๊ฒฐํ•จ์œผ๋กœ ๊ณต๊ฐœ ์•ˆ ๋จ
SSL 2.0
1995
ํ๊ธฐ
๋‹ค์ˆ˜ ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ
SSL 3.0
1996
ํ๊ธฐ
POODLE ์ทจ์•ฝ์  (2014)
TLS 1.0
1999
ํ๊ธฐ
SSL 3.0 ๊ธฐ๋ฐ˜ ์—…๊ทธ๋ ˆ์ด๋“œ
TLS 1.1
2006
ํ๊ธฐ
2020๋…„ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ์ง€์› ์ข…๋ฃŒ
TLS 1.2
2008
ํ˜„์žฌ ์‚ฌ์šฉ
ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋จ
TLS 1.3
2018
์ตœ์‹  ๊ถŒ์žฅ
๋” ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•จ
ํ˜„์žฌ "SSL ์ธ์ฆ์„œ"๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” TLS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์š”. ์ด๋ฆ„๋งŒ SSL๋กœ ๊ตณ์–ด์ง„ ๊ฑฐ์˜ˆ์š”!

SSL ์ธ์ฆ์„œ์˜ ๋™์ž‘ ์›๋ฆฌ

graph TD
    A[๐Ÿ›๏ธ CA<br/>์ธ์ฆ๊ธฐ๊ด€<br/>Let's Encrypt ๋“ฑ] -->|์ธ์ฆ์„œ ๋ฐœ๊ธ‰| B[๐Ÿ–ฅ๏ธ ์›น ์„œ๋ฒ„<br/>Nginx]
    B -->|์ธ์ฆ์„œ ์ œ์‹œ| C[๐Ÿ‘ค ๋ธŒ๋ผ์šฐ์ €]
    C -->|CA์—๊ฒŒ ๊ฒ€์ฆ ์š”์ฒญ| A
    A -->|"์ง„์งœ์•ผ!"| C
    C -->|์‹ ๋ขฐํ•˜๊ณ  ์•”ํ˜ธํ™” ํ†ต์‹  ์‹œ์ž‘| B

    style A fill:#FFD700
    style B fill:#90EE90
    style C fill:#87CEEB
Mermaid
๋ณต์‚ฌ

์ธ์ฆ์„œ ๋ฐœ๊ธ‰๋ถ€ํ„ฐ ์‚ฌ์šฉ๊นŒ์ง€

sequenceDiagram
    participant ์„œ๋ฒ„๊ด€๋ฆฌ์ž as ๐Ÿง‘โ€๐Ÿ’ป ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž
    participant CA as ๐Ÿ›๏ธ CA (์ธ์ฆ๊ธฐ๊ด€)
    participant ์„œ๋ฒ„ as ๐Ÿ–ฅ๏ธ Nginx ์„œ๋ฒ„
    participant ๋ธŒ๋ผ์šฐ์ € as ๐Ÿ‘ค ๋ธŒ๋ผ์šฐ์ €

    ์„œ๋ฒ„๊ด€๋ฆฌ์ž->>CA: โ‘  ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์š”์ฒญ<br/>(๋„๋ฉ”์ธ ์†Œ์œ  ์ฆ๋ช…)
    CA->>CA: โ‘ก ๋„๋ฉ”์ธ ์†Œ์œ  ๊ฒ€์ฆ<br/>(DNS, HTTP, ์ด๋ฉ”์ผ)
    CA-->>์„œ๋ฒ„๊ด€๋ฆฌ์ž: โ‘ข ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์™„๋ฃŒ<br/>(๊ณต๊ฐœํ‚ค + CA ์„œ๋ช… ํฌํ•จ)
    ์„œ๋ฒ„๊ด€๋ฆฌ์ž->>์„œ๋ฒ„: โ‘ฃ ์ธ์ฆ์„œ๋ฅผ Nginx์— ์„ค์น˜

    ๋ธŒ๋ผ์šฐ์ €->>์„œ๋ฒ„: โ‘ค HTTPS ์ ‘์† ์š”์ฒญ
    ์„œ๋ฒ„-->>๋ธŒ๋ผ์šฐ์ €: โ‘ฅ ์ธ์ฆ์„œ ์ „๋‹ฌ
    ๋ธŒ๋ผ์šฐ์ €->>๋ธŒ๋ผ์šฐ์ €: โ‘ฆ ์ธ์ฆ์„œ ๊ฒ€์ฆ<br/>(CA ์„œ๋ช… ํ™•์ธ, ์œ ํšจ๊ธฐ๊ฐ„, ๋„๋ฉ”์ธ ์ผ์น˜)
    ๋ธŒ๋ผ์šฐ์ €-->>์„œ๋ฒ„: โ‘ง ๊ฒ€์ฆ ์™„๋ฃŒ! ์•”ํ˜ธํ™” ํ†ต์‹  ์‹œ์ž‘ ๐Ÿ”
Mermaid
๋ณต์‚ฌ

์ธ์ฆ์„œ์— ํฌํ•จ๋œ ์ •๋ณด

ํ•ญ๋ชฉ
์„ค๋ช…
์˜ˆ์‹œ
๋„๋ฉ”์ธ๋ช…
์ธ์ฆ์„œ๊ฐ€ ์ ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ
example.com, *.example.com
๋ฐœ๊ธ‰ ๋Œ€์ƒ
์„œ๋ฒ„ ์†Œ์œ ์ž/์กฐ์ง ์ •๋ณด
Example Inc.
๋ฐœ๊ธ‰์ž
์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•œ CA
Let's Encrypt, DigiCert
๊ณต๊ฐœํ‚ค
์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค
RSA 2048-bit ๋˜๋Š” ECDSA
์œ ํšจ ๊ธฐ๊ฐ„
์ธ์ฆ์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ธฐ๊ฐ„
2024.01.01 ~ 2024.03.31
์„œ๋ช…
CA์˜ ๋””์ง€ํ„ธ ์„œ๋ช…
CA์˜ ๊ฐœ์ธํ‚ค๋กœ ์„œ๋ช…
์ผ๋ จ๋ฒˆํ˜ธ
์ธ์ฆ์„œ ๊ณ ์œ  ์‹๋ณ„์ž
๊ณ ์œ  ์ˆซ์ž

์ธ์ฆ์„œ ์ข…๋ฅ˜

๊ฒ€์ฆ ๋ ˆ๋ฒจ๋ณ„

์ข…๋ฅ˜
๊ฒ€์ฆ ์ˆ˜์ค€
๋ฐœ๊ธ‰ ์‹œ๊ฐ„
๋น„์šฉ
์ ํ•ฉํ•œ ๋Œ€์ƒ
DV (Domain Validation)
๋„๋ฉ”์ธ ์†Œ์œ ๋งŒ ํ™•์ธ
์ˆ˜ ๋ถ„
๋ฌด๋ฃŒ~์ €๊ฐ€
๊ฐœ์ธ ๋ธ”๋กœ๊ทธ, ์†Œ๊ทœ๋ชจ ์‚ฌ์ดํŠธ
OV (Organization Validation)
์กฐ์ง ์‹ค์ฒด ํ™•์ธ
์ˆ˜ ์ผ
์ค‘๊ฐ€
๊ธฐ์—… ์›น์‚ฌ์ดํŠธ
EV (Extended Validation)
์—„๊ฒฉํ•œ ์กฐ์ง ์‹ฌ์‚ฌ
์ˆ˜ ์ฃผ
๊ณ ๊ฐ€
์€ํ–‰, ๋Œ€๊ธฐ์—…

์ ์šฉ ๋ฒ”์œ„๋ณ„

์ข…๋ฅ˜
์ ์šฉ ๋„๋ฉ”์ธ
๋น„์šฉ
์˜ˆ์‹œ
๋‹จ์ผ ๋„๋ฉ”์ธ
1๊ฐœ ๋„๋ฉ”์ธ
๊ฐ€์žฅ ์ €๋ ด
example.com ์ „์šฉ
์™€์ผ๋“œ์นด๋“œ
์„œ๋ธŒ๋„๋ฉ”์ธ ์ „์ฒด
์ค‘๊ฐ„
*.example.com (www, api, admin ๋ชจ๋‘)
๋ฉ€ํ‹ฐ ๋„๋ฉ”์ธ (SAN)
์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ
๊ฐ€์žฅ ๋น„์Œˆ
example.com + example.net + example.co.kr
๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ์†Œ๊ทœ๋ชจ ์„œ๋น„์Šค๋Š” DV ์ธ์ฆ์„œ + ์™€์ผ๋“œ์นด๋“œ๋ฉด ์ถฉ๋ถ„ํ•ด์š”. Let's Encrypt์—์„œ ๋ฌด๋ฃŒ๋กœ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”!

์ธ์ฆ์„œ ํŒŒ์ผ ๊ตฌ์„ฑ

ํŒŒ์ผ
ํ™•์žฅ์ž
์„ค๋ช…
Nginx ์„ค์ •
์ธ์ฆ์„œ
.pem, .crt
์„œ๋ฒ„ ๊ณต๊ฐœํ‚ค + CA ์„œ๋ช…
ssl_certificate
๊ฐœ์ธํ‚ค
.pem, .key
์„œ๋ฒ„ ๋น„๋ฐ€ํ‚ค (์ ˆ๋Œ€ ์œ ์ถœ ๊ธˆ์ง€!)
ssl_certificate_key
์ฒด์ธ ์ธ์ฆ์„œ
.pem, .crt
์ค‘๊ฐ„ CA ์ธ์ฆ์„œ
ssl_certificate์— ํฌํ•จ
ํ’€์ฒด์ธ
fullchain.pem
์ธ์ฆ์„œ + ์ฒด์ธ ํ•ฉ๋ณธ
Let's Encrypt ๊ธฐ๋ณธ ์ œ๊ณต
graph LR
    A[๋ฃจํŠธ CA ์ธ์ฆ์„œ<br/>๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ] --> B[์ค‘๊ฐ„ CA ์ธ์ฆ์„œ<br/>์ฒด์ธ ์ธ์ฆ์„œ]
    B --> C[์„œ๋ฒ„ ์ธ์ฆ์„œ<br/>๋‚ด ๋„๋ฉ”์ธ์šฉ]

    D["fullchain.pem<br/>= ์„œ๋ฒ„ ์ธ์ฆ์„œ + ์ฒด์ธ ์ธ์ฆ์„œ"]
    E["privkey.pem<br/>= ์„œ๋ฒ„ ๊ฐœ์ธํ‚ค ๐Ÿ”"]

    style A fill:#FFD700
    style B fill:#87CEEB
    style C fill:#90EE90
    style E fill:#FFB3B3
Mermaid
๋ณต์‚ฌ
๊ฐœ์ธํ‚ค(privkey.pem)๋Š” ์ ˆ๋Œ€ ์™ธ๋ถ€์— ์œ ์ถœํ•˜๋ฉด ์•ˆ ๋ผ์š”! ์ด๊ฒŒ ์œ ์ถœ๋˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚ด ์„œ๋ฒ„๋ฅผ ์‚ฌ์นญํ•  ์ˆ˜ ์žˆ์–ด์š”.

Nginx SSL ์ƒ์„ธ ์„ค์ •

server { listen 443 ssl http2; server_name example.com; # ์ธ์ฆ์„œ ํŒŒ์ผ ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # TLS ํ”„๋กœํ† ์ฝœ (1.2, 1.3๋งŒ ํ—ˆ์šฉ) ssl_protocols TLSv1.2 TLSv1.3; # ์•”ํ˜ธํ™” ์Šค์œ„ํŠธ ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; # HSTS (HTTP Strict Transport Security) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # OCSP Stapling (์ธ์ฆ์„œ ๊ฒ€์ฆ ์†๋„ ํ–ฅ์ƒ) ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # SSL ์„ธ์…˜ ์บ์‹œ (Handshake ์žฌ์‚ฌ์šฉ) ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; }
Plain Text
๋ณต์‚ฌ

ํ•ต์‹ฌ ์ •๋ฆฌ

SSL ์ธ์ฆ์„œ = ์›น ์„œ๋ฒ„์˜ ์‹ ๋ถ„์ฆ (์‹ ์› ๋ณด์ฆ + ์•”ํ˜ธํ™” ํ‚ค ํฌํ•จ)
ํ˜„์žฌ๋Š” TLS 1.2/1.3์ด ํ‘œ์ค€, SSL์€ ์ด๋ฆ„๋งŒ ๋‚จ์•„์žˆ์Œ
CA(์ธ์ฆ๊ธฐ๊ด€)๊ฐ€ ๋„๋ฉ”์ธ ์†Œ์œ ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰
์ธ์ฆ์„œ ์ข…๋ฅ˜: DV(๊ฐ„ํŽธ) / OV(๊ธฐ์—…) / EV(์—„๊ฒฉ), ๋‹จ์ผ/์™€์ผ๋“œ์นด๋“œ/๋ฉ€ํ‹ฐ๋„๋ฉ”์ธ
fullchain.pem(์ธ์ฆ์„œ) + privkey.pem(๊ฐœ์ธํ‚ค)๋ฅผ Nginx์— ์„ค์ •