[Network] ๐ Let's Encrypt + Certbot์ผ๋ก Nginx HTTPS ๋ฌด๋ฃ SSL ์ ์ฉํ๊ธฐ
์น ์๋น์ค๋ฅผ ์ด์ํ ๋ HTTPS๋ ์ ํ์ด ์๋ ํ์์ ๋๋ค. Let’s Encrypt๋ ๋น์๋ฆฌ ๊ธฐ๊ด ISRG(Internet Security Research Group)์์ ์ด์ํ๋ ๋ฌด๋ฃ SSL/TLS ์ธ์ฆ์ ๋ฐ๊ธ ๊ธฐ๊ด์ ๋๋ค. Certbot ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ๋ น์ด ๋ช ์ค๋ก ์ธ์ฆ์ ๋ฐ๊ธ๋ถํฐ Nginx ์ค์ ์๋ํ, ์๋ ๊ฐฑ์ ๊น์ง ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๐ SSL/TLS์ HTTPS ๊ธฐ๋ณธ ๊ฐ๋ #
SSL(Secure Sockets Layer) / TLS(Transport Layer Security)๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ํต์ ์ ์ํธํํ๋ ๋ณด์ ํ๋กํ ์ฝ์ ๋๋ค. HTTPS๋ ์ด SSL/TLS ์ํธํ๋ฅผ ์ ์ฉํ HTTP๋ฅผ ์๋ฏธํฉ๋๋ค.
1HTTP (ํ๋ฌธ ์ ์ก) โ ์ค๊ฐ์ ๊ณต๊ฒฉ, ๋์ฒญ ๊ฐ๋ฅ
2HTTPS (์ํธํ ์ ์ก) โ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ, ์ ๋ขฐํ ์ ์๋ ์๋ฒ ๊ฒ์ฆTLS ํธ๋์ ฐ์ดํฌ ๋์ ์๋ฆฌ:
1ํด๋ผ์ด์ธํธ ์๋ฒ
2 โโโ ClientHello โโโโโโโโโโโโโ โ ์ํธํ ๋ฐฉ์ ์ ์
3 โโ ServerHello + ์ธ์ฆ์ โโโโโ โ ์๋ฒ ์ธ์ฆ์ ์ ๋ฌ
4 โโโ ์ธ์ฆ์ ๊ฒ์ฆ โโโโโโโโโโโโโ โ CA ์๋ช
ํ์ธ
5 โโโ ์ธ์
ํค ์์ฑ (๋์นญํค) โโโโ โ ์ดํ ๋ฐ์ดํฐ ์ํธํ
6 โโโโโโโโโ ์ํธํ ํต์ โโโโโโโโ โ์ธ์ฆ์ ์ข ๋ฅ #
| ์ข ๋ฅ | ๋ณดํธ ๋ฒ์ | ์์ |
|---|---|---|
| ๋จ์ผ ๋๋ฉ์ธ | 1๊ฐ ๋๋ฉ์ธ | example.com |
| ์์ผ๋์นด๋ | 1๊ฐ ๋๋ฉ์ธ + ๋ชจ๋ ์๋ธ๋๋ฉ์ธ | *.example.com |
| ๋ฉํฐ ๋๋ฉ์ธ(SAN) | ์ฌ๋ฌ ๋๋ฉ์ธ ๋์ | a.com, b.com |
Let’s Encrypt ํน์ง #
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋น์ฉ | ๋ฌด๋ฃ |
| ์ ํจ๊ธฐ๊ฐ | 90์ผ (์๋ ๊ฐฑ์ ํ์) |
| ๋ฐ๊ธ ๋ฐฉ์ | ACME ํ๋กํ ์ฝ ์๋ํ |
| ์ ๋ขฐ๋ | ์ฃผ์ ๋ธ๋ผ์ฐ์ ยทOS์์ ์ ๋ขฐ |
| ์ ํ | ๋์ผ ๋๋ฉ์ธ ์ฃผ๋น 5ํ ๋ฐ๊ธ ์ ํ |
Tip: ์ ํจ๊ธฐ๊ฐ์ด 90์ผ๋ก ์งง์ ์ด์ ๋ ๋ณด์ ์ฌ๊ณ ๋ฐ์ ์ ์ํฅ ๋ฒ์๋ฅผ ์ค์ด๊ณ , ์๋ ๊ฐฑ์ ์ํ๊ณ๋ฅผ ์ ๋ํ๊ธฐ ์ํด์์ ๋๋ค.
๐ ๏ธ ์ฌ์ ์ค๋น #
- ๋๋ฉ์ธ์ด ์๋ฒ IP๋ก DNS ๋ ์ฝ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค.
- ๋ฐฉํ๋ฒฝ์์ ํฌํธ 80(HTTP) ๊ณผ 443(HTTPS) ์ด ์ด๋ ค ์์ด์ผ ํฉ๋๋ค.
- Certbot ์ธ์ฆ ์ ํฌํธ 80์ ์ฌ์ฉํ๋ฏ๋ก Nginx๊ฐ ์คํ ์ค์ด์ด์ผ ํฉ๋๋ค.
1# ํฌํธ ๊ฐ๋ฐฉ ํ์ธ (Ubuntu UFW ๊ธฐ์ค)
2sudo ufw allow 80
3sudo ufw allow 443
4sudo ufw reload๐ฆ Certbot ์ค์น #
Ubuntu / Debian #
1sudo apt update
2sudo apt install nginx -y
3sudo apt install certbot python3-certbot-nginx -yRocky Linux / CentOS #
1sudo dnf install nginx -y
2sudo dnf install epel-release -y
3sudo dnf install certbot python3-certbot-nginx -yApache๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ #
python3-certbot-nginx ๋์ python3-certbot-apache๋ฅผ ์ค์นํฉ๋๋ค.
1sudo apt install certbot python3-certbot-apache -yโ๏ธ Nginx ๊ธฐ๋ณธ ์ค์ (HTTP) #
์ธ์ฆ์ ๋ฐ๊ธ ์ ์ Nginx๊ฐ ๋๋ฉ์ธ์ ์ธ์ํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
1sudo vi /etc/nginx/conf.d/example.com.conf 1server {
2 listen 80;
3 listen [::]:80;
4 server_name example.com www.example.com;
5
6 root /var/www/html;
7 index index.html;
8
9 location / {
10 try_files $uri $uri/ =404;
11 }
12}์ค์ ์ ์ฉ:
1sudo nginx -t # ๋ฌธ๋ฒ ๊ฒ์ฌ
2sudo systemctl reload nginx๐ SSL ์ธ์ฆ์ ๋ฐ๊ธ #
Nginx ํ๋ฌ๊ทธ์ธ ๋ฐฉ์ (๊ถ์ฅ) #
Certbot์ด Nginx ์ค์ ์ ์๋์ผ๋ก ์์ ํด์ค๋๋ค.
1sudo certbot --nginx -d example.com -d www.example.com๋ฐ๊ธ ๊ณผ์ ์์ ์ด๋ฉ์ผ ์ฃผ์ ์ ๋ ฅ, ์ด์ฉ์ฝ๊ด ๋์, HTTPโHTTPS ๋ฆฌ๋ค์ด๋ ํธ ์ค์ ์ฌ๋ถ๋ฅผ ๋ฌป์ต๋๋ค.
๋ฐ๊ธ ์ฑ๊ณต ์ ์๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
1Successfully received certificate.
2Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
3Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
4This certificate expires on 2026-07-25.Standalone ๋ฐฉ์ (Nginx ์ค์ง ํ ๋ฐ๊ธ) #
1sudo systemctl stop nginx
2sudo certbot certonly --standalone -d example.com
3sudo systemctl start nginxํฌํธ 80์ Certbot์ด ์ง์ ์ฌ์ฉํ๋ฏ๋ก Nginx๋ฅผ ๋จผ์ ์ค์งํด์ผ ํฉ๋๋ค.
Webroot ๋ฐฉ์ #
Nginx๋ฅผ ์ค์งํ์ง ์๊ณ ๋ฐ๊ธํ ์ ์์ต๋๋ค.
1sudo certbot certonly --webroot \
2 -w /var/www/html \
3 -d example.com \
4 -d www.example.com๐ ๋ฐ๊ธ ํ Nginx ์ค์ #
--nginx ์ต์
์ผ๋ก ๋ฐ๊ธํ๋ฉด ์ค์ ์ด ์๋์ผ๋ก ์์ ๋ฉ๋๋ค. ์๋์ผ๋ก ์ ์ฉํ๋ ๊ฒฝ์ฐ ์๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
1# HTTP โ HTTPS ๋ฆฌ๋ค์ด๋ ํธ
2server {
3 listen 80;
4 listen [::]:80;
5 server_name example.com www.example.com;
6 return 301 https://$host$request_uri;
7}
8
9# HTTPS ์๋ฒ
10server {
11 listen 443 ssl;
12 listen [::]:443 ssl;
13 server_name example.com www.example.com;
14
15 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
16 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
17 include /etc/letsencrypt/options-ssl-nginx.conf;
18 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
19
20 root /var/www/html;
21 index index.html;
22
23 location / {
24 try_files $uri $uri/ =404;
25 }
26}์ค์ ์ ์ฉ:
1sudo nginx -t
2sudo systemctl reload nginx๐ ์๋ ๊ฐฑ์ ์ค์ #
Let’s Encrypt ์ธ์ฆ์๋ 90์ผ๋ง๋ค ๋ง๋ฃ๋ฉ๋๋ค. ์๋ ๊ฐฑ์ ์ ๋ฐ๋์ ์ค์ ํด์ผ ํฉ๋๋ค.
๊ฐฑ์ ํ ์คํธ #
1sudo certbot renew --dry-run--dry-run์ ์ค์ ๊ฐฑ์ ์์ด ๊ฐฑ์ ๊ณผ์ ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
Crontab์ผ๋ก ์๋ ๊ฐฑ์ #
1sudo crontab -e์๋ ๋ผ์ธ์ ์ถ๊ฐํฉ๋๋ค. ๋ง๋ฃ 30์ผ ์ ๋ถํฐ ๊ฐฑ์ ์ ์๋ํฉ๋๋ค.
1# ๋งค์ผ ์ ์ค์ ๊ฐฑ์ ํ์ธ
20 12 * * * /usr/bin/certbot renew --quiet
3
4# ๋๋ ๋งค์ฃผ ์์์ผ ์๋ฒฝ 3์ + ๊ฐฑ์ ํ Nginx ์ฌ์์
50 3 * * 1 /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"Systemd Timer๋ก ์๋ ๊ฐฑ์ (Ubuntu ๊ถ์ฅ) #
Ubuntu 22.04 ์ด์์์๋ Certbot ํจํค์ง ์ค์น ์ systemd timer๊ฐ ์๋์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค.
1# ํ์ด๋จธ ์ํ ํ์ธ
2sudo systemctl status certbot.timer
3
4# ์๋์ผ๋ก ๊ฐฑ์ ์คํ
5sudo certbot renew๐ ์ธ์ฆ์ ๊ด๋ฆฌ ๋ช ๋ น์ด #
1# ๋ฐ๊ธ๋ ์ธ์ฆ์ ๋ชฉ๋ก ํ์ธ
2sudo certbot certificates
3
4# ํน์ ๋๋ฉ์ธ ์ธ์ฆ์ ๊ฐฑ์
5sudo certbot renew --cert-name example.com
6
7# ์ธ์ฆ์ ํ๊ธฐ
8sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/fullchain.pem
9
10# ์ธ์ฆ์ ์ญ์ (๋ก์ปฌ ํ์ผ๋ง ์ญ์ )
11sudo certbot delete --cert-name example.comโ ํธ๋ฌ๋ธ์ํ #
๋ฐ๊ธ ์คํจ: ํ์์์ ์ค๋ฅ #
1Timeout during connect (likely firewall problem)โ ๋ฐฉํ๋ฒฝ์์ ํฌํธ 80/443 ๊ฐ๋ฐฉ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ํด๋ผ์ฐ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋ณด์ ๊ทธ๋ฃน(Security Group)๋ ํ์ธํฉ๋๋ค.
๋ฐ๊ธ ์คํจ: ๋๋ฉ์ธ ํ์ธ ์ค๋ฅ #
1DNS problem: NXDOMAIN looking up A for example.comโ DNS A ๋ ์ฝ๋๊ฐ ์๋ฒ IP๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
1dig A example.com
2nslookup example.comNginx ์ค์ ์ค๋ฅ #
1nginx: [emerg] invalid parameterโ sudo nginx -t๋ก ์ค์ ๋ฌธ๋ฒ์ ๊ฒ์ฌํ๊ณ , ์ธ๋ฏธ์ฝ๋ก ยท๊ดํธ ๋๋ฝ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
์ฃผ๋น ๋ฐ๊ธ ํ๋ ์ด๊ณผ #
1Error: too many certificates already issued for exact set of domainsโ Let’s Encrypt๋ ๋์ผ ๋๋ฉ์ธ์ ๋ํด ์ฃผ๋น 5ํ ๋ฐ๊ธ ์ ํ์ด ์์ต๋๋ค. --staging ์ต์
์ผ๋ก ํ
์คํธ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ์ฌ ์ค์ ์ ๊ฒ์ฆํ ํ ์ค์ ๋ฐ๊ธํฉ๋๋ค.
1# ํ
์คํธ ์ธ์ฆ์ ๋ฐ๊ธ (ํ๋ ๋ฏธ์๋ชจ)
2sudo certbot --nginx --staging -d example.comโ ์์ฝ #
sudo apt install certbot python3-certbot-nginx๋ก Certbot์ ์ค์นํฉ๋๋ค.- Nginx์
server_name์ ์ค์ ํ ๋คsudo certbot --nginx -d ๋๋ฉ์ธ์ผ๋ก ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํฉ๋๋ค. - ๋ฐ๊ธ ํ
/etc/letsencrypt/live/๋๋ฉ์ธ/๊ฒฝ๋ก์ ์ธ์ฆ์๊ฐ ์ ์ฅ๋ฉ๋๋ค. sudo certbot renew --dry-run์ผ๋ก ์๋ ๊ฐฑ์ ์ ํ ์คํธํ ๋ค crontab ๋๋ systemd timer๋ก ์๋ ๊ฐฑ์ ์ ์ค์ ํฉ๋๋ค.