๊ฐ์
์ด์์ค์ธ ์๋น์ค ์ค์์ 8003 ํฌํธ์๋ง ssl ์ ์ ์ฉํ๋ ค๊ณ ํ๋ค.
์งํ ์์ฝ
- ๋๋ฉ์ธ ์ด๋ฆ์ด ์์ด IP๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ OpenSSL๋ก ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
- NGINX๋ฅผ HTTPS ์ฒ๋ฆฌ ๋ด๋น์๋ก ๋๊ณ , ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐฑ์๋ ์๋น์ค๋ก ํ๋ก์ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ค์
- openssl ์ธ์ฆ์ ์ฌ์ฉ ์ “์ฃผ์ ์ํจ” ๊ฒฝ๊ณ ํ์ธ → ๋ฌด๋ฃ ๊ณต์ธ ์ธ์ฆ์ ๋ฐ๊ธ ์งํ
- ์ธ์ฆ์ ์๋ ๊ฐฑ์ ์ค์
์งํ
1. openssl๋ก ์ธ์ฆ์ ๋ฐ๊ธ
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/selfsigned.key \
-out /etc/ssl/certs/selfsigned.crt
- -x509: ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ์์ฑ
- -days 365: ์ธ์ฆ์ ์ ํจ ๊ธฐ๊ฐ (1๋ )
- -keyout: ๊ฐ์ธ ํค ๊ฒฝ๋ก
- -out: ์ธ์ฆ์ ํ์ผ ๊ฒฝ๋ก
2. nginx ์ค์ ์์
/etc/nginx/nginx.conf
server {
listen 8003 ssl; # 8003 ํฌํธ์์ HTTPS ์์
server_name your_server_ip; # ์๋ฒ์ IP ์ฃผ์ ๋๋ ๋๋ฉ์ธ ์ด๋ฆ
ssl_certificate /path/to/your_certificate.crt; # SSL ์ธ์ฆ์ ๊ฒฝ๋ก
ssl_certificate_key /path/to/your_private.key; # SSL ๊ฐ์ธ ํค ๊ฒฝ๋ก
# SSL ์ต์ ํ ์ต์
(๊ถ์ฅ)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8003; # ๋ฐฑ์๋ ์๋น์ค๋ก ํ๋ก์
proxy_set_header Host $host; # ์๋ณธ ํธ์คํธ ํค๋ ์ ๋ฌ
proxy_set_header X-Real-IP $remote_addr; # ํด๋ผ์ด์ธํธ IP ์ ๋ฌ
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # ํ๋ก์ ์ฒด์ธ ์ ๋ฌ
proxy_set_header X-Forwarded-Proto $scheme; # ์์ฒญ ์คํค๋ง ์ ๋ฌ
}
}
# nginx conf ์์ ํ ์ค์ ํ
์คํธ
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# ํ
์คํธ ๋ฌธ์ ์๋ค๋ฉด restart
sudo systemctl restart nginx
์ด๋ ๊ฒ openssl์ ํตํด์ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ์์ “์ฃผ์ ์ํจ” ๋๋ “๋น๋ณด์ ์ฐ๊ฒฐ” ๊ฒฝ๊ณ ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๊ฒ ์ซ๋ค๋ฉด ๊ณต์ธ๋ ์ธ์ฆ ๊ธฐ๊ด์์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์์ผํ๋ค.
3. Let's Encrypt
๊ฐ์ฅ ๋๋ฆฌ ์๋ ค์ง SSL/TLS ์ธ์ฆ ๊ธฐ๊ด Let's Encrypt์ Certbot์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ฐ๊ธ๋ฐ์ ์ ์๋ค.
๋ฌด๋ฃ๋ก ๋ฐ์ ์ธ์ฆ์๋ 3๊ฐ์์ ์ ํจ๊ธฐ๊ฐ์ ๋ฐ๋๋ฐ, ์๋ ๊ฐฑ์ ์ค์ ํ ์ ์๋ค. (์๋ ๊ฐฑ์ ์ ์๋์์ ๋ค๋ฃธ)
- apt๋ก ์ค์นํ certbot์ด Python ํจํค์ง ๋ฒ์ ์ถฉ๋์ด ๋ฐ์ํ์ฌ, Snap ํจํค์ง๋ก Certbot์ ์ค์นํ๋ค.
- DNS ๋ฑ๋ก์ด ์๋ฃ๋ ํ ์งํํด์ผํ๋ค. (โญ๏ธ nslookup ์ผ๋ก ํ ์คํธ ํ๊ณ ์งํ)
# Snap ์ค์น
sudo apt update
sudo apt install snapd
# Snap ์๋น์ค ํ์ฑํ
sudo systemctl enable --now snapd
# Snap Certbot ์ค์น
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# ์ธ์ฆ์ ๋ฐ๊ธ
sudo certbot --nginx -d ddeng.io
- --nginx: Nginx ์ค์ ์ ์๋์ผ๋ก ์์
- ์ธ์ฆ์ ๋ฐ๊ธ ์ค์ ๋ช๊ฐ์ง ์ง๋ฌธ์ ๋ฐ๋๋ค.
- ์ด๋ฉ์ผ ์ฃผ์: ์ธ์ฆ์ ๊ฐฑ์ ๋๋ ๋ฌธ์ ๋ฐ์ ์ ์ฐ๋ฝ๋ฐ์ ์ด๋ฉ์ผ ์ฃผ์ ์ ๋ ฅ
- ์๋น์ค ์ฝ๊ด ๋์: ์ฝ๊ด ๋์ํด์ผ ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค.
- HTTP ์์ฒญ์ HTTPS๋ก ์๋ ๋ฆฌ๋ค์ด๋ ์
ํ ์ง?
- ์ฌ๊ธฐ์ ๋์์ํด๋ ๋์ค์ nginx ์ค์ ์์ ๊ฐ๋ฅ
4. nginx ์ค์ ํ์ผ ํ์ธ
์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ์ผ๋ฉด์ nginx ์ค์ ์ด ์๋์ผ๋ก ์์ ๋์๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ์์ ํด์ผํจ
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ddeng.io "์ฌ๊ธฐ ๋๋ฉ์ธ ์ด๋ฆ ์
๋ ฅ!!";
return 301 https://$host$request_uri;
}
server {
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
server_name "์ฌ๊ธฐ ๋๋ฉ์ธ ์ด๋ฆ ์
๋ ฅ!!";
ssl_certificate /etc/letsencrypt/live/ddeng.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ddeng.io/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:8003;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Proto https;
}
}
server {
if ($host = ddeng.io) {
return 301 https://$host$request_uri;
}
listen 80 ;
listen [::]:80 ;
server_name "์ฌ๊ธฐ ๋๋ฉ์ธ ์ด๋ฆ ์
๋ ฅ!!";
return 404;
}
- return 301 https://$host$request_uri;
- HTTP ์์ฒญ์ HTTPS๋ก ์๊ตฌ ๋ฆฌ๋ค์ด๋ ํธ(301 ์ํ ์ฝ๋)ํ๋ ์ค์
- listen [::]:443 ssl ipv6only=on;
- IPv6 ์ฃผ์๋ฅผ ํตํด HTTPS(443๋ฒ ํฌํธ) ์์ฒญ์ ์ฒ๋ฆฌ
- listen 443 ssl;
- IPv4 ์ฃผ์๋ฅผ ํตํด HTTPS(443๋ฒ ํฌํธ) ์์ฒญ์ ์ฒ๋ฆฌ
์ธ์ฆ์ ์ ๋ณด
- ssl_certificate: Let's Encrypt๊ฐ ๋ฐ๊ธํ ์ธ์ฆ์(fullchain.pem)๋ฅผ ์ฌ์ฉ
- ssl_certificate_key: Let's Encrypt๊ฐ ์ ๊ณตํ๋ ๊ฐ์ธ ํค(privkey.pem)
- include /etc/letsencrypt/options-ssl-nginx.conf;: Let's Encrypt๊ฐ ์ ๊ณตํ๋ SSL ๋ณด์ ์ค์ ์ ํฌํจ(๊ถ์ฅ ์ํธํ ๋ฐฉ์, TLS ๋ฒ์ ๋ฑ)
- ssl_dhparam: SSL ์ฐ๊ฒฐ์ ์ํ Diffie-Hellman ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ์ฌ ๋ณด์์ ๊ฐํ
location
- proxy_pass http://127.0.0.1:8003;: ์์ฒญ์ ๋ฐฑ์๋ ์๋ฒ(๋ก์ปฌ์ 8003 ํฌํธ)๋ก ์ ๋ฌ
- proxy_http_version 1.1;: HTTP/1.1์ ์ฌ์ฉํ์ฌ ํ๋ก์ ์์ฒญ ์ ์ก (WebSocket๊ณผ ๊ฐ์ ์ง์ ์ฐ๊ฒฐ์ ์ง์ํ๊ธฐ ์ํด ํ์)
- proxy_set_header Upgrade $http_upgrade;: WebSocket ์ฐ๊ฒฐ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ง์
- proxy_set_header Connection 'upgrade';: WebSocket ํ๋กํ ์ฝ ์ ๊ทธ๋ ์ด๋ ์ค์
- proxy_set_header Host $host;: ์๋ ์์ฒญ์ Host ํค๋๋ฅผ ์ ๋ฌํ์ฌ ๋ฐฑ์๋๊ฐ ์ฌ๋ฐ๋ฅธ ๋๋ฉ์ธ์ ์ธ์ํ๋๋ก..
- proxy_cache_bypass $http_upgrade;: ์บ์ฑ์ ์ฐํํ์ฌ ์ค์๊ฐ ์์ฒญ(WebSocket ๋ฑ)์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋๋ก..
- proxy_set_header X-Forwarded-Proto https;: ํด๋ผ์ด์ธํธ๊ฐ HTTPS๋ก ์์ฒญํ์์ ๋ฐฑ์๋ ์๋ฒ์ ์ ๋ฌ, ๋ฐฑ์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ํ๋กํ ์ฝ(HTTPS)์ ์ธ์ํ๋๋ก..
5. Nginx ์ฌ์์
# nginx config ์์ ํ ํ
์คํธ
sudo nginx -t
# ํ
์คํธ ๋ฌธ์ ์๋ค๋ฉด ์ฌ์์
sudo systemctl restart nginx
6. ๋ธ๋ผ์ฐ์ ์ ๊ทผ
http๋ก ์ ๊ทผํ๋ฉด https๋ก ์๋ ๋ฆฌ๋ค์ด๋ ํธ๋๋ฉฐ, ์ธ์ฆ์๊ฐ ์ ์ ์ฉ๋จ์ ํ์ธํ ์ ์๋ค.
7. ์ธ์ฆ์ ์๋๊ฐฑ์ ์ค์
๊ทผ๋ฐ ์ธ์ฆ์ ์ ํจ ๊ธฐ๊ฐ์ 3๊ฐ์์ด๋ค. ๋ง๋ฃ๋๊ธฐ ์ ์๋ ๊ฐฑ์ ํ๋ ค๋ฉด Certbot์์ ์ ๊ณตํ๋ ์๋ ๊ฐฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
1. Crontab ์์ ์ถ๊ฐ
$ crontab -e
0 */12 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
- 0 */12 * * *: ๋งค์ผ 12์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์คํ
- certbot renew: ์ธ์ฆ์๋ฅผ ๊ฐฑ์
- --quiet: ๋ก๊ทธ ์ถ๋ ฅ ์์ด ์์ ์ ์กฐ์ฉํ ์ํ
- --deploy-hook "systemctl reload nginx": ์ธ์ฆ์ ๊ฐฑ์ ํ Nginx๋ฅผ ๋ค์ ๋ก๋ํ์ฌ ์๋ก์ด ์ธ์ฆ์๋ฅผ ์ ์ฉ
2. Certbot ๊ฐฑ์ ํ ์คํธ
sudo certbot renew --dry-run
- ํ ์คํธ ์ฑ๊ณต: Congratulations, all renewals succeeded.
- ํ ์คํธ ์คํจ: ๋ก๊ทธ ํ์ผ์ ํ์ธํ์ฌ ๋ฌธ์ ๋ฅผ ์ง๋จ
sudo cat /var/log/letsencrypt/letsencrypt.log
'๐ฉ๐ปโ๐ป > network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Celery] ์ ์ ํ concurrency ๊ฐ ์ค์ ํ๊ธฐ (0) | 2025.02.19 |
---|---|
[Proxy] ๋ฆฌ๋ฒ์ค ํ๋ก์ Reverse Proxy ์ ๋ฆฌ (0) | 2025.01.24 |
RPC vs gRPC (0) | 2025.01.14 |
์ธํฐ๋ท ์๋ 2๊ฐ์ PC ํต์ ํ๋ ๋ฐฉ๋ฒ (1) | 2024.11.28 |
[gRPC] gRPC๊ณผ websocket ๋น๊ต ์ ๋ฆฌ (1) | 2024.11.25 |