Let's Encrypt로 NGINX SSL 설정하기

agnusdei·2023년 10월 31일

웹사이트의 SSL/TLS 암호화는 검색 순위를 높이고 사용자의 보안을 강화합니다. 그러나 SSL/TLS 인증서를 얻고 설정하는 것은 비용이 들고 수동적인 작업일 수 있습니다. 다행히 Let's Encrypt를 사용하면 이러한 문제를 간단하게 해결할 수 있습니다. Let's Encrypt는 자동화된 개방형 인증 기관(CA)로, SSL/TLS 인증서를 무료로 발급합니다. 이 블로그 게시물에서는 Let's Encrypt 클라이언트를 사용하여 SSL 인증서를 생성하고, NGINX OSS 및 NGINX Plus를 사용하여 이를 자동으로 구성하는 방법을 자세하게 설명합니다.

1. Let's Encrypt 작동 원리

SSL 인증서를 발급하기 전, Let's Encrypt는 도메인 소유권을 확인합니다. 호스트에서 실행되는 Let's Encrypt 클라이언트는 필요한 정보가 들어있는 임시 파일(토큰)을 생성하고, Let's Encrypt 유효성 검사 서버는 HTTP 요청을 만들어 해당 파일을 찾고 토큰의 유효성을 확인합니다. 이를 통해 도메인 소유권을 확인하며, 이 프로세스는 자동화됩니다.

2. 전제 조건

Let's Encrypt를 시작하기 전에 다음을 수행해야 합니다:

2-1. Let's Encrypt 클라이언트 다운로드

먼저 Let's Encrypt 클라이언트를 다운로드합니다. Ubuntu 16.04를 기준으로, 아래 명령을 사용하여 설치합니다.

$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python-certbot-nginx

Ubuntu 18.04 이상에서는 Python 3 버전을 사용합니다.

2-2. NGINX SSL 설정

SSL/TLS를 사용하도록 NGINX를 구성해야 합니다. NGINX 설정 파일에서 도메인 이름을 서버 블록에 추가하고 SSL 설정을 구성해야 합니다. 이를 통해 NGINX가 HTTPS를 지원할 준비가 됩니다.

2-3. SSL/TLS 인증서 받기

이제 Let's Encrypt 클라이언트를 사용하여 인증서를 생성합니다. 아래 명령을 사용하여 인증서를 생성하고 NGINX 설정을 업데이트합니다:

$ sudo certbot --nginx -d example.com -d www.example.com

위 명령에서 "example.com"과 "www.example.com"을 자신의 도메인으로 대체해야 합니다.

2-4. Let's Encrypt 인증서 자동 갱신

Let's Encrypt 인증서는 90일마다 만료됩니다. 따라서 인증서를 자동으로 갱신하는 것이 중요합니다. 이를 위해 cron 작업을 설정합니다.

$ crontab -e

Cron 작업 파일을 열고 다음 명령을 추가합니다:

0 12 * * * /usr/bin/certbot renew --quiet

이 명령은 매일 정오에 실행되며, 서버의 인증서가 만료되지 않도록 갱신합니다.

3. 인증서 확인

Let's Encrypt 인증서가 성공적으로 생성되면 아래와 같은 메시지가 표시됩니다:

Congratulations! You have successfully enabled https://example.com and https://www.example.com 

중요한 참고 사항은 다음과 같이 인증서 및 키 파일의 위치, 그리고 인증서 만료일입니다. Let's Encrypt 인증서는 90일마다 만료되므로 주기적으로 갱신해야 합니다.

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
Your cert will expire on 2017-12-12.

또한, NGINX 설정 파일 (domain-name.conf)가 자동으로 수정되어 SSL 관련 설정이 추가되며, HTTP를 HTTPS로 리디렉션하는 구문이 추가됩니다.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name  example.com www.example.com;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # Redirect non-https traffic to https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글