๋ณธ ์๋ฆฌ์ฆ๋ Ubuntu Server 20.04 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Let's Encrypt ๋ฌด๋ฃ ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ ์๋๊ฐฑ์ ์ค์ ๊ณผ์ ์ ๋ค๋ฃฐ ์์ ์ด๋ค.
๋๋ฉ์ธ์ ํ๋ณดํ์ผ๋ฉด ๊ทธ ๋๋ฉ์ธ์ ๋ํ ๋ณด์ ์ํ๋ฅผ ์ธ์ฆํด์ฃผ๋ TLS ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์๋๋ฐ, ์ด ์ธ์ฆ์๋ ์น์ฌ์ดํธ์ https ์ ์๋ฟ๋ง ์๋๋ผ ๋ณด์์ด ํ์ํ FTPS, VPN ๋ฑ์ ์ฌ๋ฌ ๊ฐ์ง ์ฐ๊ฒฐ์๋ ์ฌ์ฉํ ์ ์๋ค.
TLS ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ์ฌ๋ฌ ๊ธฐ๊ด ์ค์์ Letโs Encrypt๋ ๋ฌด๋ฃ๋ก DV(Domain Validation) ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํด์ค๋ค.
Letโs Encrypt๋ ๊ฒ์ฆ๋ ์ธ์ฆ๊ธฐ๊ด(CA)์ผ๋ก์, Letโs Encrypt์ ์ธ์ฆ์๋ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์ VPN ํด๋ผ์ด์ธํธ ๋ฑ์์ ์ ๋ขฐ ๋๋ค.
Letโs Encrypt๊ฐ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๋ฐฉ์์๋ ๋๋ฉ์ธ๋ง ์ด์ฉํ๋ ๋ฐฉ์, ์ด์ ์ค์ธ ์น์ฌ์ดํธ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์, DNS์ TXT ๋ ์ฝ๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
์ด ์ค์์ DNS์ TXT ๋ ์ฝ๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด *.example.com ํํ์ ์์ผ๋์นด๋ ์๋ธ๋๋ฉ์ธ์ ๋ํ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ด์ ํ๋์ ์ธ์ฆ์๋ก ๋ชจ๋ ์๋ธ๋๋ฉ์ธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด ํธ๋ฆฌํ๋ค.
Letโs Encrypt ์ธ์ฆ์์ ์ ํจ๊ธฐ๊ฐ์ 90์ผ์ด๊ณ , ์ ํจ๊ธฐ๊ฐ์ด 30์ผ ๋จ์์ ๋๋ถํฐ ๊ฐฑ์ ํ ์ ์๋ค.
์์ผ๋์นด๋ ์ธ์ฆ์๋ ๊ฐฑ์ ํ ๋๋ง๋ค DNS์ TXT ๋ ์ฝ๋๋ฅผ ์๋ก ์์ฑํด์ผ ํ๋๋ฐ, DNS ๋ ์ฝ๋๋ฅผ ์ธ๋ถ์์ ์ ๋ ฅํ ์ ์๋๋ก API๋ฅผ ์ ๊ณตํ๋ DNS ์๋น์ค๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ฐ๋ถํฌ ์๋ฒ์์ ๋ชจ๋ ๊ฐฑ์ ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
Letโs Encrypt์์ ์ถ์ฒํ๋ ์ธ์ฆ์ ๋ฐ๊ธ ํ๋ก๊ทธ๋จ์ธ Certbot์ ์์ผ๋์นด๋ ์ธ์ฆ์ ์๋ ๊ฐฑ์ ์ ์ํด ์ฌ๋ฌ ๊ฐ์ง DNS ์๋น์ค๋ฅผ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ง์ํ๋๋ฐ, ์ฌ๊ธฐ์๋ CloudFlare์ DNS ์๋น์ค๋ฅผ ์ ํํ๋ค.
CloudFlare์ Global API Key๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ Global API Key ์ ๋ณด๊ฐ ๋ด๊ธด ํ์ผ์ ์ฐ๋ถํฌ ์๋ฒ์ ์์ฑํ์.
Cloudflare์ ๋ก๊ทธ์ธ์ด ๋ ์ํ๋ผ๋ฉด Cloudflare API Key ํ์ธ ๋งํฌ์ ์ ์ํด Global API Key๋ฅผ ํ์ธํ ์ ์๋ค.
ํ์ผ์ด ์์นํ ์์์ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
sudo mkdir /root/.secrets
์์ฑํ ๋๋ ํ ๋ฆฌ ์๋์ certbot-cloudflare.ini
๋ผ๋ ์ด๋ฆ์ผ๋ก Global API Key ์ ๋ณด๊ฐ ๋ด๊ธธ ํ์ผ์ nano ํธ์ง๊ธฐ๋ก ์์ฑํ๋ค. ํ์ผ ์ด๋ฆ์ ์ํ๋ ๋๋ก ์์ฑํ๋ฉด ๋๋ค.
dns_cloudflare_email = mail@example.com
dns_cloudflare_api_key = qwertyuiop1234567890
nano ํธ์ง๊ธฐ๊ฐ ์ด๋ฆฌ๋ฉด ์์ ํ์์ผ๋ก ์์ ์ ๊ฐ์ ๊ธฐ๋กํ๋ค.
mail@example.com
์ CloudFlare์ ๋ก๊ทธ์ธ ID๋ก ์ฌ์ฉํ๋ ์ด๋ฉ์ผ ์ฃผ์์ด๊ณ , kq70flsb6lcqd8g262c2b673vb73290vkxj2a
์ ์์ ํ์ธํ Global API Key ๊ฐ์ด๋ค.
ํธ์ง์ ๋ง์ณค์ผ๋ฉด Ctrlํค์ xํค๋ฅผ ๋์์ ๋๋ฌ์ nano ํธ์ง๊ธฐ๋ฅผ ๋น ์ ธ๋์ค๋ฉด์ ์ ์ฅํ๋ค.
ํ์ผ์ด ์์นํ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ root ์ํผ์ ์ ๋ง ์ ๊ทผํ ์ ์๋๋ก ๊ถํ์ ์กฐ์ ํ๋ค.
sudo chmod 0700 /root/.secrets
sudo chmod 0400 /root/.secrets/certbot-cloudflare.ini
Letโs Encrypt๊ฐ ์ถ์ฒํ๋ ์ธ์ฆ์ ๋ฐ๊ธ ํ๋ก๊ทธ๋จ์ธ Certbot๊ณผ ์์ผ๋์นด๋ ์ธ์ฆ์ ์๋ ๊ฐฑ์ ์ ์ํ CloudFlare ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ค.
sudo apt update
sudo apt install certbot -y
sudo apt install python3-certbot-dns-cloudflare -y
๋ฐ๊ธ๋ ์ธ์ฆ์๋ฅผ ์น ์๋ฒ์ ์ ์ฉ๊น์ง ํด์ฃผ๋ python-certbot-nginx, python-certbot-apache ๋ฑ์ ๋ช ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ทธ๋ฐ๋ฐ ์น ์๋ฒ์ ์๋์ผ๋ก ์ ์ฉํด์ฃผ๋ ๋ด์ฉ์ด ์ผ๋ฅ ์ ์ด๋ผ์ ์ด์ฐจํผ ๋ค์ ํธ์งํด์ผ ํ๋ฏ๋ก ์ธ์ฆ์๋ง ๋ฐ๊ธ๋ฐ์์ ์ง์ ์ ์ฉํ๋ ํธ์ด ์คํ๋ ค ๊ฐํธํ๋ค.
์๋ ํ์์ ๋ช ๋ น์ ์คํํ๋ฉด ์์ผ๋์นด๋ ์ธ์ฆ์๊ฐ ๋ฐ๊ธ๋๋ค.
sudo certbot certonly --dns-cloudflare --preferred-challenges dns-01 --dns-cloudflare-propagation-seconds 20 --dns-cloudflare-credentials /root/.secrets/certbot-cloudflare.ini -d example.com -d *.example.com
certonly
: ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ๊ธฐ๋ง ํ๊ณ ์ ์ฉ์ ํ์ง ์๋ ๋ฐฉ์
--dns-cloudflare
: CloudFlare ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ๋ชจ๋
--preferred-challenges dns-01
: DNS ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ๋ ๋ฐฉ์
--dns-cloudflare-propagation-seconds 20
: CloudFlare์ DNS์ TXT ๋ ์ฝ๋๊ฐ ์์ฑ๋ ํ Letโs Encrypt๊ฐ ์ด๋ฅผ ํ์ธํ ๋๊น์ง(DNS ๋ ์ฝ๋๊ฐ ๋ฐ์๋ ๋๊น์ง) 20์ด ๋๊ธฐ
--dns-cloudflare-credentials
: ์์ ์์ฑํ Global API Key ์ ๋ณด ํ์ผ์ ์์น
-d
: ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ ๋๋ฉ์ธ์ ์
๋ ฅํ๋๋ฐ, www. ๋ฑ์ ์ ๋์ฌ๊ฐ ์๋ ๋ฃจํธ ๋๋ฉ์ธ example.com
๊ณผ ์ ๋์ฌ์ ์์ผ๋์นด๋๋ฅผ ์ ์ฉํ *.example.com
์ ๊ฐ๊ฐ ์
๋ ฅ
์ ๋ช ๋ น์ ์คํํ๋ฉด ์๋์ฒ๋ผ ๋ช ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํ๋ค.
(A)gree/(C)ancel:
์ฝ๊ด์ ๋์ํ๊ธฐ ์ํด a๋ฅผ ์
๋ ฅํ๋ค.
(Y)es/(N)o:
์ ๋ณด ์ด๋ฉ์ผ ์์ ์ ์ํ๋ฉด y, ์ํ์ง ์์ผ๋ฉด n์ ์
๋ ฅํ๋ค.
์ธ์ฆ์ ๋ฐ๊ธ์ ์ฑ๊ณตํ๋ฉด ์๋์ ๊ฐ์ด /etc/letsencrypt/live/example.com/
๊ฒฝ๋ก์ ์ธ์ฆ์๊ฐ ์ ์ฅ๋์๋ค๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
๋ณด๋ค ์์ธํ๊ฒ๋ ์ด 4์ข ๋ฅ์ ์ธ์ฆ์ ํ์ผ์ด ์์ฑ๋๋๋ฐ ๊ฐ๊ฐ ๋ค์์ ์ด๋ฆ์ผ๋ก ์ ์ฅ๋๋ค:
/etc/letsencrypt/live/example.com/cert.pem
/etc/letsencrypt/live/example.com/chain.pem
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem
Letโs Encrypt ์ธ์ฆ์๋ ์ ํจ๊ธฐ๊ฐ์ด 90์ผ์ด๊ณ ์ ํจ๊ธฐ๊ฐ์ด 30์ผ ๋จ์์ ๋๋ถํฐ ์ธ์ฆ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋๋ฐ, ์ฐ๋ถํฌ ์๋ฒ 17.10 ์ด์์ ๋ฒ์ ์์ ์ฐ๋ถํฌ ์ ์ฅ์๋ฅผ ํตํด์ Certbot์ ์ค์นํ๋ฉด ์ฐ๋ถํฌ ์๋ฒ์ ์์ ์ค์ผ์ค๋ฌ์ ์ธ์ฆ์ ์๋ ๊ฐฑ์ ๋ช ๋ น์ด ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ ์ธ ๊ฒ์ด ์๋ค.
์ธ์ฆ์ ์๋ ๊ฐฑ์ ์ค์ผ์ค์ด ์ ์ ์ฉ๋์๋์ง ํ์ธํ๋ ค๋ฉด ์๋ ๋ช ๋ น์ ์คํํ์.
sudo systemctl status certbot.timer
์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
โ certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Mon 2022-02-14 22:52:08 KST; 1 weeks 1 days ago
Trigger: Wed 2022-02-23 05:11:46 KST; 2h 17min left
Triggers: โ certbot.service
Feb 14 22:52:08 ktw-physical systemd[1]: Started Run certbot twice daily.
๋ง์ผ ๊ฐฑ์ ์์ ์ด ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ๋ช ๋ น์ ์คํํด ๊ฐฑ์ ์๋ฎฌ๋ ์ด์ ์ ์งํํ์
sudo certbot renew --dry-run
์ฑ๊ณตํ๋ฉด ์๋์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
์ธ์ฆ์๊ฐ ๊ฐฑ์ ๋๋ฉด ๊ฐฑ์ ๋ ์ธ์ฆ์๋ฅผ ๋ค๋ฅธ ์๋น์ค์ ์ ์ฉํ๋ ์ผ โ ์๋ฅผ ๋ค์ด ์น์ฌ์ดํธ๋ฅผ ์ด์ ์ค์ด๋ผ๋ฉด ์น ์๋ฒ๋ฅผ ๋ฆฌ๋ก๋ ํ๋ ์ผ, VPN์ ๊ตฌ์ฑํ๋ค๋ฉด VPN์ ์ฌ์คํํ๋ ์ผ ๋ฑ์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋๋ฐ, Certbot์ Hook ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์ถ๊ฐ ์์ ๋ ๋ชจ๋ ๊ฐ์ด ์๋ํํ ์ ์๋ค.
์ฐ์ , ์ธ์ฆ์ ๊ฐฑ์ ์ดํ์ ํํฌ ์์
์ ๊ด๋ฆฌํ๋ ๋๋ ํ ๋ฆฌ์ธ /etc/letsencrypt/renewal-hooks/deploy/
๊ฒฝ๋ก์ ์ธ์ฆ์๊ฐ ๊ฐฑ์ ๋๋ฉด ์ถ๊ฐ๋ก ์งํํ ์ฌ๋ฌ ๊ฐ์ง ๋ช
๋ น์ ๋ชจ์ ๋์ ์คํฌ๋ฆฝํธ ํ์ผ์ nano ํธ์ง๊ธฐ๋ก ์์ฑํ๋ค.
ํ์ผ ์ด๋ฆ์ ์ํ๋ ๋๋ก ์ ํ๋ฉด ๋๋ค.
sudo nano /etc/letsencrypt/renewal-hooks/deploy/certbot-deploy-hook.sh
์ด ํ์ผ์ ์ธ์ฆ์๊ฐ ๊ฐฑ์ ๋๋ฉด ์ถ๊ฐ๋ก ์งํํ ์ฌ๋ฌ ๊ฐ์ง ๋ช ๋ น์ ๊ธฐ๋กํ๋ค. ์๋ ์์๋ Nginx ์น ์๋ฒ๋ฅผ ๋ฆฌ๋ก๋ํ๋ ๋ด์ฉ์ด๋ค.
#!/bin/bash
/bin/systemctl reload nginx
์์ ์๊ฒ ํ์ํ ๋ด์ฉ์ ์์ฑํ๊ณ , Ctrlํค์ xํค๋ฅผ ๋์์ ๋๋ฌ nano ํธ์ง๊ธฐ๋ฅผ ๋น ์ ธ๋์ค๋ฉด์ ์ ์ฅํ๋ค.
์์ฑํ ํ์ผ์ ์คํ ๊ถํ์ ๋ถ์ฌํ๋ค.
sudo chmod u+x /etc/letsencrypt/renewal-hooks/deploy/certbot-deploy-hook.sh
์ด์ ์ธ์ฆ์๊ฐ ๊ฐฑ์ ๋๋ฉด certbot-deploy-hook.sh ํ์ผ์ ๋ด์ฉ์ด ์๋์ผ๋ก ์คํ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Let's Encrypt ๋ฌด๋ฃ ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ ์๋๊ฐฑ์ ์ค์ ๊ณผ์ ์ ๋ค๋ค๋ค.
๋ค์ ํฌ์คํ ์์๋ Nginx ์ค์น ๋ฐ ์ค์ ๊ณผ์ ์ ๋ค๋ฃฐ ์์ ์ด๋ค.
์ค! ์ด๋ ๊ฒ ๋ํ ์ผํ๊ฒ ์ค๋ช ํด์ฃผ์ ์ ์ฝ๊ฒ ๋ฐ๋ผํด๋ด ๋๋ค ๐