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:#E0E0E0Mermaid
๋ณต์ฌ
# ๊ฐฑ์ ํ
์คํธ (์ค์ ๊ฐฑ์ ์ ํจ, ์๋ฎฌ๋ ์ด์
)
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 ๊ฒ์ฆ ํ์




