[Nginx] Let's Encrypt - SSL Certificates

반응형

이번글에서는 Let's Encrypt를 사용해 Nginx에 무료로 SSL 인증서를 설치하는 방법에 대해 알아보도록 하겠습니다.

1. Let's Encrypt란?

보안 웹사이트를 위한 인증서의 수동 생성, 유효성 확인, 디지털 서명, 설치, 갱신 등 종전의 복잡한 과정을 없애주는 자동화된 프로세스를 통해 전송 계층 보안(TLS) 암호화를 위해 무료 X.509 인증서를 제공하는 인증 기관입니다. (https://ko.wikipedia.org/wiki/Let's_Encrypt)

이 프로젝트는 SSL 인증서의 비용으로 인해 HTTPS 적용을 망설이는 사용자들에게 SSL 인증서를 무료로 발급해 HTTPS를 널리 보급하기위해 시작되었습니다.

URL : https://letsencrypt.org/ko/

Let's Encrypt에서 제공하는 SSL 인증서를 사용하기위해선 certbot이라는 오픈소스 라이브러리를 사용해야 합니다.

URL : https://certbot.eff.org/

2. Setting Let's Encrypt

Nginx에 certbot을 사용해서 Let's Encrypt를 적용해보도록 하겠습니다.

2-1) create domain

가장 먼저 Let's Encrypt를 적용하기 위해선 domain을 발급받아야 합니다. Let's Encrypt는 domain 주소가 아니면 SSL 인증서를 발급해주지 않습니다.

만약 AWS의 EC2 서버를 사용하고 있다면, 이 글을 참고해 도메인을 연결하시면 됩니다.

저는 test.daily-mission.com 이라는 도메인을 사용하도록 하겠습니다. 😎

저는 이번 글에서 아래와 같이 간단한 nginx.conf를 사용하도록 하겠습니다. server_name에는 각자 본인들의 domain을 입력하면 됩니다.

nginx.conf

events {}

http {

    server {
        listen 80;
        server_name test.daily-mission.com;

        location / {
            return 200 "Hello NGINX \n";
        }
    }
}

http로 접근하면 아래와 같이 결과값이 return 되는것을 확인할 수 있습니다.

https는 등록되어 있지 않으므로 아래와 같이 접근이 거부됩니다.

2-2) install certbot

다음으로 certbot을 다운로드 받도록 하겠습니다.

아래의 명령어를 입력해 certbot을 다운로드 받겠습니다. 각자 본인들의 Linux 버전에 맞는 다운로드 방법을 [공식 홈페이지] (https://certbot.eff.org/)에서 확인 후 다운로드 받으시면 됩니다.

# enable epel repo
sudo yum -y install epel-release
sudo yum repolist

# install certbot
sudo yum install certbot python2-certbot-nginx

다운로드가 정상적으로 완료되었다면 아래의 명령어를 입력해 certbot 정보를 확인할 수 있습니다.

# certbot 
certbot --help

certbot를 사용해 Nginx에 SSL 인증서를 다운받기위해선 아래의 두가지 명령어 중 하나를 선택해 사용합니다.

# get and install SSL
sudo certbot --nginx

# only get SSL
sudo certbot certonly --nginx

첫번째 명령어를 사용해 install & get 을 수행한다면, certbot이 Nginx의 configuration을 자동으로 수정해 최적화된 HTTPS(SSL) 환경을 제공합니다. 이는 강제적으로 수행되기 때문에, 실제 운영되고 있는 서버에 Let's Encrypt을 적용할 경우에는 적합하지 않습니다.

두번째 명령어를 사용해 get 만 수행할 경우, 사용자가 직접 Nginx에 SSL 관련 Configuration을 작성해야 합니다.

저는 첫번째 명령어를 사용해 certbot이 제공해주는 HTTPS Configuration을 사용하도록 하겠습니다.

다운로드 수행시 나오는 질문에는 저는 아래와 같이 순서대로 답변했습니다. 각자 본인들의 server에 맞게 입력해주시면 됩니다.

# enter email address
alsgkgk77@gmail.com

# agree to use let's encrypt
A

# want to share your address
N

# select https domain
1

# choose redirect or not
1

짜잔 😎. 다음과 같이 SSL 인증서 발급이 완료되었습니다. 👏👏👏

이제 아래의 경로에서 생성된 SSL Certificate를 확인할 수 있습니다.

/etc/letsencrypt/live/[domain]/

2-3) test https

이제 다시 https를 수행해보면 아래와 같이 정상적으로 response 하는 것을 확인할 수 있습니다.

nginx.conf 파일을 확인해보면 아래와 같이 자동으로 SSL 관련 설정들이 추가되어있는 것을 확인할 수 있습니다.

nginx.conf

events {}

http {

    server {
        listen 80;
        server_name test.daily-mission.com;

        location / {
            return 200 "Hello NGINX \n";
        }

        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/test.daily-mission.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/test.daily-mission.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    }
}

위의 include에 명시되어 있는 /etc/letsencrypt/options-ssl-nginx.conf 파일을 열어보면 다음과 같이 SSL 관련 설정들이 작성되어 있습니다. 매우 편리하네요..😅

options-ssl-nginx.conf

2-4) renew ssl certificate

1~2년에 한번씩 갱신하는 다른 인증서들과 달리 let's encrypt로 발급받은 ssl 인증서는 90일에 한번씩 갱신을 해야합니다.

ssl 인증서를 갱신하기위해선 아래의 명령어를 사용합니다.

# renew ssl
certbot renew

만약 아직 갱신날짜가 되지 않은 ssl 인증서는 skipped 처리 됩니다.

만약 강제로 갱신하고 싶다면 아래의 명령어를 사용합니다.

# force renew ssl
certbot renew --dry-run

마지막으로 linux의 cron schedule을 이용해 매일 매일 ssl 인증서의 expiration date를 확인해 갱신할 날짜가 되면 갱신하도록 아래와 같이 crontab에 등록하겠습니다.

# open crontab
crontab -e

# add daily renew ssl schedule
@daily certbot renew

이제 매일 매일 linux schedule이 certbot renew 명령어를 수행해 만료된 인증서를 자동으로 갱신하게 됩니다. 👏👏👏


참고 자료 : https://www.udemy.com/course/nginx-fundamentals/


반응형

'Nginx' 카테고리의 다른 글

[Nginx] Load Balancer  (0) 2020.08.31
[Nginx] Reverse Proxy  (0) 2020.08.31
[Nginx] Hardening Nginx  (0) 2020.08.31
[Nginx] Basic Auth  (0) 2020.08.31
[Nginx] Rate Limiting  (0) 2020.08.31

댓글

Designed by JB FACTORY