Search

Let's Encrypt

Let's Encrypt

๊ฐœ์š”

Let's Encrypt๋Š” ๋ฌด๋ฃŒ๋กœ SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์ž๋™ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๋น„์˜๋ฆฌ ์ธ์ฆ๊ธฐ๊ด€(CA)์ด๋‹ค. Certbot ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋ฐœ๊ธ‰, ์„ค์น˜, ๊ฐฑ์‹ ์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ์ „์—๋Š” SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋ˆ์„ ๋‚ด์•ผ ํ–ˆ์–ด์š”. ์—ฐ๊ฐ„ ์ˆ˜๋งŒ ์›์—์„œ ์ˆ˜์‹ญ๋งŒ ์›๊นŒ์ง€ ๋น„์šฉ์ด ๋“ค์—ˆ์ฃ . ๊ทธ๋ž˜์„œ ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” HTTPS๋ฅผ ์ ์šฉํ•˜๊ธฐ ๋ถ€๋‹ด์Šค๋Ÿฌ์› ์–ด์š”.
Let's Encrypt๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์–ด์š”. 2015๋…„์— ์‹œ์ž‘๋œ ์ด ํ”„๋กœ์ ํŠธ๋Š” "์ธํ„ฐ๋„ท์˜ ๋ชจ๋“  ์›น์‚ฌ์ดํŠธ๊ฐ€ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์ž!"๋ผ๋Š” ๋ชฉํ‘œ๋กœ, ์™„์ „ ๋ฌด๋ฃŒ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ค˜์š”. Mozilla, Google, Meta ๊ฐ™์€ ๋Œ€๊ธฐ์—…๋“ค์ด ํ›„์›ํ•˜๊ณ  ์žˆ์–ด์„œ ๊ฑฑ์ • ์—†์ด ์‚ฌ์šฉํ•ด๋„ ๋ผ์š”!

Let's Encrypt vs ์œ ๋ฃŒ ์ธ์ฆ์„œ

ํ•ญ๋ชฉ
Let's Encrypt
์œ ๋ฃŒ ์ธ์ฆ์„œ (DigiCert ๋“ฑ)
๋น„์šฉ
์™„์ „ ๋ฌด๋ฃŒ
์—ฐ๊ฐ„ ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ ์›
์ธ์ฆ ์ˆ˜์ค€
DV (๋„๋ฉ”์ธ ๊ฒ€์ฆ๋งŒ)
DV / OV / EV
์œ ํšจ ๊ธฐ๊ฐ„
90์ผ (์ž๋™ ๊ฐฑ์‹ )
1~2๋…„
๋ฐœ๊ธ‰ ์‹œ๊ฐ„
์ˆ˜ ๋ถ„ (์ž๋™ํ™”)
์ˆ˜ ๋ถ„ ~ ์ˆ˜ ์ฃผ
์™€์ผ๋“œ์นด๋“œ
์ง€์›
์ง€์›
๊ธฐ์ˆ  ์ง€์›
์ปค๋ฎค๋‹ˆํ‹ฐ (ํฌ๋Ÿผ)
์ „๋ฌธ ๊ณ ๊ฐ ์ง€์›
๋ณด์ฆ ๋ฐฐ์ƒ๊ธˆ
์—†์Œ
์žˆ์Œ (ํ•ดํ‚น ์‹œ ๋ณด์ƒ)
์ ํ•ฉํ•œ ๋Œ€์ƒ
๊ฐœ์ธ, ์Šคํƒ€ํŠธ์—…, ์†Œ๊ทœ๋ชจ ์„œ๋น„์Šค
๊ธˆ์œต, ๋Œ€๊ธฐ์—…, ๊ณต๊ณต๊ธฐ๊ด€
90์ผ์ด ์งง์•„ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”! Certbot์ด๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•ด์ฃผ๋‹ˆ๊นŒ, ํ•œ ๋ฒˆ ์„ค์ •ํ•ด๋‘๋ฉด ์‹ ๊ฒฝ ์“ธ ์ผ์ด ์—†์–ด์š”.

์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ณผ์ •

sequenceDiagram
    participant ๊ด€๋ฆฌ์ž as ๐Ÿง‘โ€๐Ÿ’ป ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž
    participant Certbot as ๐Ÿค– Certbot
    participant Nginx as ๐Ÿ–ฅ๏ธ Nginx
    participant LE as ๐Ÿ›๏ธ Let's Encrypt

    ๊ด€๋ฆฌ์ž->>Certbot: certbot --nginx -d example.com
    Certbot->>LE: ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์š”์ฒญ
    LE->>Certbot: ๋„๋ฉ”์ธ ์†Œ์œ  ์ฆ๋ช… ์š”๊ตฌ<br/>(์ฑŒ๋ฆฐ์ง€ ๋ฐœ๊ธ‰)
    Certbot->>Nginx: ์ฑŒ๋ฆฐ์ง€ ํŒŒ์ผ ๋ฐฐ์น˜<br/>(.well-known/acme-challenge/)
    LE->>Nginx: ์ฑŒ๋ฆฐ์ง€ ํŒŒ์ผ ํ™•์ธ<br/>(HTTP-01 ๊ฒ€์ฆ)
    Nginx-->>LE: ์ฑŒ๋ฆฐ์ง€ ์‘๋‹ต ์ „๋‹ฌ
    LE-->>Certbot: โœ… ๊ฒ€์ฆ ์„ฑ๊ณต! ์ธ์ฆ์„œ ๋ฐœ๊ธ‰
    Certbot->>Nginx: ์ธ์ฆ์„œ ์„ค์น˜ + ์„ค์ • ์ž๋™ ์ˆ˜์ •
    Certbot-->>๊ด€๋ฆฌ์ž: ๐ŸŽ‰ ์™„๋ฃŒ! HTTPS ์‚ฌ์šฉ ๊ฐ€๋Šฅ
Mermaid
๋ณต์‚ฌ
์ด ๊ณผ์ •์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด:
1.
์„œ๋ฒ„์—์„œ Certbot ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์š”.
2.
Certbot์ด Let's Encrypt์—๊ฒŒ "์ด ๋„๋ฉ”์ธ์˜ ์ธ์ฆ์„œ ์ฃผ์„ธ์š”!" ํ•˜๊ณ  ์š”์ฒญํ•ด์š”.
3.
Let's Encrypt๊ฐ€ "์ •๋ง ๊ทธ ๋„๋ฉ”์ธ์˜ ์ฃผ์ธ์ด ๋งž์•„? ์ฆ๋ช…ํ•ด๋ด!" ํ•˜๊ณ  ์ฑŒ๋ฆฐ์ง€๋ฅผ ์ค˜์š”.
4.
Certbot์ด ์„œ๋ฒ„์— ํŠน๋ณ„ํ•œ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , Let's Encrypt๊ฐ€ ๊ทธ ํŒŒ์ผ์„ HTTP๋กœ ํ™•์ธํ•ด์š”.
5.
ํ™•์ธ์ด ๋˜๋ฉด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ณ , Certbot์ด Nginx ์„ค์ •๊นŒ์ง€ ์ž๋™์œผ๋กœ ํ•ด์ค˜์š”!

๋„๋ฉ”์ธ ์†Œ์œ  ๊ฒ€์ฆ ๋ฐฉ์‹

๋ฐฉ์‹
์ด๋ฆ„
์„ค๋ช…
์™€์ผ๋“œ์นด๋“œ
์ž๋™ํ™”
HTTP-01
HTTP ์ฑŒ๋ฆฐ์ง€
์›น ์„œ๋ฒ„์— ํŠน์ • ํŒŒ์ผ ๋ฐฐ์น˜ ํ›„ ํ™•์ธ
์‰ฌ์›€
DNS-01
DNS ์ฑŒ๋ฆฐ์ง€
DNS TXT ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ ํ›„ ํ™•์ธ
์„ค์ • ํ•„์š”
TLS-ALPN-01
TLS ์ฑŒ๋ฆฐ์ง€
TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋กœ ํ™•์ธ
์ผ๋ฐ˜ ๋„๋ฉ”์ธ์€ HTTP-01 ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๊ฐ„ํŽธํ•ด์š”. ์™€์ผ๋“œ์นด๋“œ ์ธ์ฆ์„œ(*.example.com)๊ฐ€ ํ•„์š”ํ•˜๋ฉด DNS-01 ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

Certbot ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ๋ฒ•

์„ค์น˜ (Ubuntu)

# Certbot ์„ค์น˜ sudo apt update sudo apt install certbot python3-certbot-nginx
Bash
๋ณต์‚ฌ

์ธ์ฆ์„œ ๋ฐœ๊ธ‰

# ๐ŸŒŸ Nginx ์ž๋™ ์„ค์ • (๊ฐ€์žฅ ์ถ”์ฒœ!) sudo certbot --nginx -d example.com -d www.example.com # ์ธ์ฆ์„œ๋งŒ ๋ฐœ๊ธ‰ (Nginx ์„ค์ •์€ ์ง์ ‘) sudo certbot certonly --nginx -d example.com # ์™€์ผ๋“œ์นด๋“œ ์ธ์ฆ์„œ (DNS ๊ฒ€์ฆ ํ•„์š”) sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
Bash
๋ณต์‚ฌ

๋ฐœ๊ธ‰ ํ›„ ํŒŒ์ผ ์œ„์น˜

ํŒŒ์ผ
๊ฒฝ๋กœ
์šฉ๋„
fullchain.pem
/etc/letsencrypt/live/๋„๋ฉ”์ธ/fullchain.pem
์ธ์ฆ์„œ + ์ฒด์ธ (ssl_certificate)
privkey.pem
/etc/letsencrypt/live/๋„๋ฉ”์ธ/privkey.pem
๊ฐœ์ธํ‚ค (ssl_certificate_key)
chain.pem
/etc/letsencrypt/live/๋„๋ฉ”์ธ/chain.pem
์ฒด์ธ ์ธ์ฆ์„œ (OCSP Stapling์šฉ)
cert.pem
/etc/letsencrypt/live/๋„๋ฉ”์ธ/cert.pem
์„œ๋ฒ„ ์ธ์ฆ์„œ๋งŒ

์ž๋™ ๊ฐฑ์‹  ์„ค์ •

Let's Encrypt ์ธ์ฆ์„œ๋Š” 90์ผ๋งˆ๋‹ค ๋งŒ๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋™ ๊ฐฑ์‹  ์„ค์ •์ด ํ•„์ˆ˜์˜ˆ์š”!
graph LR
    A[Cron Job / Systemd Timer<br/>๋งค์ผ 2ํšŒ ์‹คํ–‰] --> B[certbot renew<br/>๊ฐฑ์‹  ํ•„์š” ํ™•์ธ]
    B -->|๋งŒ๋ฃŒ 30์ผ ์ด๋‚ด| C[์ธ์ฆ์„œ ๊ฐฑ์‹ ]
    B -->|์•„์ง ์—ฌ์œ  ์žˆ์Œ| D[์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•จ]
    C --> E[Nginx ๋ฆฌ๋กœ๋“œ<br/>์ƒˆ ์ธ์ฆ์„œ ์ ์šฉ]

    style A fill:#87CEEB
    style C fill:#90EE90
    style D fill:#E0E0E0
Mermaid
๋ณต์‚ฌ
# ๊ฐฑ์‹  ํ…Œ์ŠคํŠธ (์‹ค์ œ ๊ฐฑ์‹  ์•ˆ ํ•จ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜) sudo certbot renew --dry-run # ์ž๋™ ๊ฐฑ์‹  ์„ค์ • ํ™•์ธ (๋ณดํ†ต ์„ค์น˜ ์‹œ ์ž๋™ ๋“ฑ๋ก๋จ) sudo systemctl list-timers | grep certbot # ์ˆ˜๋™ ๊ฐฑ์‹  (ํ•„์š”์‹œ) sudo certbot renew # ๊ฐฑ์‹  ํ›„ Nginx ๋ฆฌ๋กœ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ•˜๋ ค๋ฉด sudo certbot renew --deploy-hook "systemctl reload nginx"
Bash
๋ณต์‚ฌ

Cron์œผ๋กœ ์ž๋™ ๊ฐฑ์‹  ์„ค์ •

# crontab ํŽธ์ง‘ sudo crontab -e # ๋งค์ผ ์ƒˆ๋ฒฝ 2์‹œ, ์˜คํ›„ 2์‹œ์— ๊ฐฑ์‹  ์‹œ๋„ (์•„๋ž˜ ์ค„ ์ถ”๊ฐ€) 0 2,14 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
Bash
๋ณต์‚ฌ
Certbot์€ ๋งŒ๋ฃŒ 30์ผ ์ „๋ถ€ํ„ฐ ๊ฐฑ์‹ ์„ ์‹œ๋„ํ•ด์š”. ๋งค์ผ ์‹คํ–‰ํ•ด๋„ ์•„์ง ๊ฐฑ์‹ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•˜๋‹ˆ๊นŒ, ์ž์ฃผ ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์•„์š”!

์ž๋™ ์„ค์ •๋œ Nginx ์„ค์ • ํ™•์ธ

certbot --nginx๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Nginx ์„ค์ • ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์ˆ˜์ •๋ผ์š”:
server { listen 443 ssl; server_name example.com www.example.com; # Certbot์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•œ ์„ค์ • ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; root /var/www/html; index index.html; } # HTTP โ†’ HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (Certbot์ด ์ž๋™ ์ƒ์„ฑ) server { listen 80; server_name example.com www.example.com; if ($host = www.example.com) { return 301 https://$host$request_uri; } if ($host = example.com) { return 301 https://$host$request_uri; } return 404; }
Plain Text
๋ณต์‚ฌ

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

๋ฌธ์ œ
์›์ธ
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
๋ฐœ๊ธ‰ ์‹คํŒจ: "connection refused"
80 ํฌํŠธ๊ฐ€ ๋ง‰ํ˜€์žˆ์Œ
sudo ufw allow 80 ๋ฐฉํ™”๋ฒฝ ํ—ˆ์šฉ
๋ฐœ๊ธ‰ ์‹คํŒจ: "too many requests"
๋ฐœ๊ธ‰ ํšŸ์ˆ˜ ์ œํ•œ ์ดˆ๊ณผ
1์‹œ๊ฐ„ ๋Œ€๊ธฐ ํ›„ ์žฌ์‹œ๋„, ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ
๊ฐฑ์‹  ์‹คํŒจ
Nginx๊ฐ€ ์ค‘์ง€๋จ
Nginx ์ƒํƒœ ํ™•์ธ ํ›„ ์žฌ์‹œ์ž‘
"์ธ์ฆ์„œ ๋งŒ๋ฃŒ" ๊ฒฝ๊ณ 
์ž๋™ ๊ฐฑ์‹  ๋ฏธ์„ค์ •
cron ๋˜๋Š” systemd timer ์„ค์ •
์™€์ผ๋“œ์นด๋“œ ๋ฐœ๊ธ‰ ์‹คํŒจ
HTTP-01 ๋ฐฉ์‹ ์‚ฌ์šฉ
DNS-01 ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ

ํ•ต์‹ฌ ์ •๋ฆฌ

Let's Encrypt = ๋ฌด๋ฃŒ SSL/TLS ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€ (DV ์ธ์ฆ)
Certbot = Let's Encrypt ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰/์„ค์น˜/๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋„๊ตฌ
๋ฐœ๊ธ‰: sudo certbot --nginx -d ๋„๋ฉ”์ธ ํ•œ ์ค„์ด๋ฉด ๋!
์œ ํšจ๊ธฐ๊ฐ„ 90์ผ โ†’ ์ž๋™ ๊ฐฑ์‹  ํ•„์ˆ˜ (cron ๋˜๋Š” systemd timer)
์™€์ผ๋“œ์นด๋“œ ์ธ์ฆ์„œ๋Š” DNS-01 ๊ฒ€์ฆ ํ•„์š”