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:#87CEEBMermaid
๋ณต์ฌ
์ธ์ฆ์ ๋ฐ๊ธ๋ถํฐ ์ฌ์ฉ๊น์ง
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:#FFB3B3Mermaid
๋ณต์ฌ
๊ฐ์ธํค(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์ ์ค์




