๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/network

ํŠน์ • port์˜ ์„œ๋น„์Šค์—๋งŒ HTTPS 443 SSL ์ ์šฉํ•˜๊ธฐ

by ๋ฐ”์ฟ„๋ฆฌ 2025. 1. 22.

๊ฐœ์š”

์šด์˜์ค‘์ธ ์„œ๋น„์Šค ์ค‘์—์„œ 8003 ํฌํŠธ์—๋งŒ ssl ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ง„ํ–‰ ์š”์•ฝ

  1. ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์—†์ด IP๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ OpenSSL๋กœ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  2. NGINX๋ฅผ HTTPS ์ฒ˜๋ฆฌ ๋‹ด๋‹น์ž๋กœ ๋‘๊ณ , ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋กœ ํ”„๋ก์‹œํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ •
  3. openssl ์ธ์ฆ์„œ ์‚ฌ์šฉ ์‹œ “์ฃผ์˜ ์š”ํ•จ” ๊ฒฝ๊ณ  ํ™•์ธ → ๋ฌด๋ฃŒ ๊ณต์ธ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์ง„ํ–‰
  4. ์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹  ์„ค์ •

์ง„ํ–‰

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