์›น์„œ๋ฒ„์— HTTPS ์ ์šฉํ•˜๊ธฐ (Letโ€™s Encrypt, Nginx, AWS EC2)

March 3, 2023์— ์ž‘์„ฑ

๊ฐ€์ •

  • HTTP๋ฅผ ์ ์šฉํ•  ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ AWS EC2์— ์˜ฌ๋ ค์ ธ ์žˆ๋‹ค.
  • Nginx๋ฅผ ์‚ฌ์šฉํ•ด HTTPS ์„ค์ •์„ ํ•œ๋‹ค. (ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Nginx๊ฐ€ ์„œ๋ฒ„ ์•ž๋‹จ์—์„œ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์•„์„œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋„˜๊ฒจ์ค€๋‹ค. - ์ด๋ฅผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ผ ํ•œ๋‹ค)

Nginx ์„ค์ •ํ•˜๊ธฐ

Nginx ์„ค์น˜

# ์„ค์น˜ 1 (redhat ๊ณ„์—ด. ex. Amazon linux 2)
sudo yum clean metadata
sudo yum -y install nginx

# ๋งŒ์•ฝ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ž.
sudo amazon-linux-extras enable nginx1

# ์„ค์น˜ 2 (debian ๊ณ„์—ด. ex. Ubuntu)
sudo apt-get install nginx

Nginx ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

์„ค์น˜ํ•˜๊ณ  ๋‚˜๋ฉด /etc/nginx ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. nginx์˜ ๋ฃจํŠธ ์„ค์ • ํŒŒ์ผ์€ /etc/nginx/nginx.conf ์ธ๋ฐ, ๋ณดํ†ต ํ•ด๋‹น ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง„ ์•Š๊ณ , ์—ฌ๋Ÿฌ ํ•˜์œ„ ์„ค์ •ํŒŒ์ผ์„ ๋‘๊ณ  ์ด ํŒŒ์ผ์—์„œ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ๋กœ๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. (์ฝ”๋“œ์—์„œ ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ) nginx.conf ํŒŒ์ผ์„ ๋ณด๋ฉด ์žˆ๋Š” include /etc/nginx/conf.d/*.conf ์ฝ”๋“œ๊ฐ€ ์„ค์ •์„ ๋กœ๋”ฉํ•ด์˜จ๋‹ค.

https ์„ค์ •์„ ์œ„ํ•ด์„œ conf.d ํด๋” ํ•˜์œ„์— default.conf ๊ฐ™์€ ์ƒˆ๋กœ์šด ์„ค์ •ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์ž.

server {
    listen 443 ssl;
    server_name <๋„๋ฉ”์ธ ์ด๋ฆ„>

    location / {
        proxy_pass http://127.0.0.1:<์›น์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ>;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }

    # ์•„๋ž˜ ๋ถ€๋ถ„์€ Let's encrypt๋ฅผ ํ†ตํ•ด SSL ์ธ์ฆ์„ ๋ฐ›์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    ssl_certificate /etc/letsencrypt/live/<SSL ๋ฐœ๊ธ‰๋ฐ›์€ ๋„๋ฉ”์ธ ์ด๋ฆ„>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<SSL ๋ฐœ๊ธ‰๋ฐ›์€ ๋„๋ฉ”์ธ ์ด๋ฆ„>/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

# http๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์€ https๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
server {
    listen 80;
    location / {
        return 301 <๋„๋ฉ”์ธ ์ด๋ฆ„>$request_uri;
    }
}

Nginx ์‹คํ–‰, ๋กœ๋”ฉ ๋ช…๋ น์–ด

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด nginx๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

sudo service nginx start # nginx ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ
sudo service nginx reload # ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด ์„ค์ •ํŒŒ์ผ์„ ๋กœ๋”ฉํ•ด์˜จ๋‹ค.

SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ํ•˜๊ธฐ

nginx์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด๋ณด์ž. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” ์›น์‚ฌ์ดํŠธ๋“ค์€ CA๋ผ๋Š” ๋ฃจํŠธ ์ธ์ฆ๊ธฐ๊ด€์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š”๋ฐ, ์ง์ ‘ ๋ฐœ๊ธ‰ํ•˜๋ ค๋ฉด Let's encrypt ๋กœ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค(๋‚˜๋ฅผ ๋‚ด๊ฐ€ ์ธ์ฆํ•˜๋Š” ์‹).

๋„๋ฉ”์ธ ๊ตฌ๋งค

์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋ ค๋ฉด ๋„๋ฉ”์ธ์ด ๋ฌด์กฐ๊ฑด ์žˆ์–ด์•ผ ํ•œ๋‹ค. IP๋งŒ์œผ๋กœ๋Š” ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.

AWS์—์„œ ์ œ๊ณตํ•˜๋Š” public domain์„ ์“ฐ๋ฉด ์•ˆ๋ ๊นŒ? ์‹ถ์ง€๋งŒ, AWS ๋„๋ฉ”์ธ์€ ์‚ฌ์‹ค ์ž„์‹œ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ๋“ค์ด๋ผ ๋ณด์•ˆ ์œ„ํ—˜์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์• ์ดˆ์— LetsEncrypt์—์„œ ๋ง‰์•„๋‘์—ˆ๋‹ค.

๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์ €๋ ดํ•˜๊ฒŒ ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ฑฐ๋‚˜, ๋ฌด๋ฃŒ๋กœ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์—์„œ ๋ฐœ๊ธ‰ํ•˜์ž.

Certbot ์„ค์น˜

Letโ€™s encrypt์—์„œ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ์‹์ธ Certbot์„ ์‚ฌ์šฉํ•˜๋ฉด SSL ์ธ์ฆ์„œ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

sudo yum install certbot
sudo yum install python-certbot-nginx # nginx์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

Letโ€™s Encrypt๋กœ SSL ๋ฐœ๊ธ‰ํ•˜๊ธฐ

sudo certbot --nginx  -d <๋„๋ฉ”์ธ ์ด๋ฆ„>

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด /etc/letsencrypt/live/ ํ•˜์œ„์— ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋œ ํด๋”๊ฐ€ ํ•˜๋‚˜ ์ƒ๊ธฐ๊ณ , SSL ์ธ์ฆ์„ ์œ„ํ•œ ํŒŒ์ผ๋“ค์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ nginx์˜ ์„ค์ •ํŒŒ์ผ์— ์ž…๋ ฅํ•ด์ฃผ๊ณ , nginx ์„ค์ •์„ ๋ฆฌ๋กœ๋“œํ•ด์˜ค๋ฉด ๋ชจ๋“  ์„ค์ •์ด ๋๋‚œ๋‹ค.

์ธ์ฆ์„œ ๊ฐฑ์‹  ์ž๋™ํ™”ํ•˜๊ธฐ

Letโ€™s Encrypt๋Š” 90์ผ ๋งˆ๋‹ค ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ง์ ‘ ์ฃผ๊ธฐ๋งˆ๋‹ค ๊ฐฑ์‹ ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๋ถˆํŽธํ•˜๋ฏ€๋กœ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ ์ž๋™ํ™”ํ•ด๋ณด์ž. linux์—๋Š” crontab ์ด๋ผ๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ crontab ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ํŽธ์ง‘๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์ž.

crontab -e # ์Šค์ผ€์ค„๋Ÿฌ ํŽธ์ง‘๊ธฐ ์‹คํ–‰

๊ทธ๋ฆฌ๊ณ  ํŽธ์ง‘๊ธฐ์— ๋งค์›” 1์ผ 0์‹œ 0๋ถ„์— certbot renew ๋กœ ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ์Šค์ผ€์ค„๋Ÿฌ ๋“ฑ๋ก์ด ๋๋‚œ๋‹ค.

0 0 1 * * certbot renew --renew-hook "sudo service nginx reload"