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