Profile picture

[Linux] Nginx에서 HTTPS 설정하기 - Let's Encrypt로 인증서 발급 및 자동 갱신까지!

JaehyoJJAng2024년 12월 26일

개요

오늘 포스팅에서는 Nginx 환경에서 HTTPS를 설정하는 방법과

Let's Encrypt를 활용해 무료 SSL 인증서를 발급받는 과정에 대해서 기록해보려고 합니다!

추가로 인증서 만료 시 자동 갱신하는 방법 까지 포함해서요!


준비 단계

HTTPS를 설정하려면 몇 가지 준비물이 필요해요.

서버에 Nginx가 설치되어 있다는 가정하에 진행하도록 할게요!


참고로 현재 /etc/nginx/sites-available/default 설정은 다음과 같아요.

server {
    listen 80;
    listen [::]:80;

    server_name mirror.example.com;

    root /mirror/proxmox/iso;

    location / {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

필요한 조건

  • 도메인 mirror.example.com과 같이 공용 IP와 연결된 DNS 설정(A 레코드)이 완료되어 있어야 해요.
  • 포트: Let's Encrypt 인증 과정에서 80번 포트를 사용하니, 방화벽에서 80번과 443번 포트가 열려 있어야 합니다.
  • Certbot: 인증서 발급과 관리를 쉽게 해주는 도구인지, 아직 설치하지 않았다면 아래에서 설치 과정을 다룰게요!

1. Certbot 설치하기

Let's Encrypt 인증서를 발급하려면 Certbot이 필요해요.

Ubuntu/Debian 기반 환경이라고 가정하고 설치 명령어를 실행해봐요!

sudo apt update && sudo apt upgrade -y
sudo apt install certbot python3-certbot-nginx -y
  • python3-certbot-nginx: Nginx 플러그인으로, 설정을 자동으로 수정해줍니다.

2. Let's Encrypt로 SSL 인증서 발급받기

  • Certbot은 Nginx 설정을 읽고 자동으로 HTTPS를 적용할 수 있어요. 아래 단계를 따라해보세요.

인증서 발급 명령어

sudo certbot --nginx -d mirror.example.com
  • -d: 인증서를 발급받을 도메인을 지정해주세요.
    • 여러 도메인을 추가하려면 -d mirror.example.com -d www.example.com처럼 하면 됩니다.

실행 중 질문

  • 이메일 입력: 인증서 만료 알림을 받을 이메일을 입력하세요.
  • 약관 동의: A를 눌러 동의합니다.
  • 리다이렉션 설정: HTTP -> HTTPS로 리다이렉트할지 묻는데, 2를 선택해 활성화하는 걸 추천해요.

이렇게 질문들에 대해 설정을 하고 나면 Certbot이 자동으로 인증서를 발급해줘요!


nginx 설정 수정

준비 단계에서 보여드렸던 nginx 설정을 다음과 같이 수정해줘야 해요!

server {
    listen 80;
    listen [::]:80;
    server_name mirror.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name mirror.example.com;

    root /mirror/proxmox/iso;

    ssl_certificate /etc/letsencrypt/live/mirror.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mirror.example.com/privkey.pem;

    location / {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

설정 적용

설정에 오류가 없는지 확인하고 Nginx를 재시작해요.

sudo nginx -t
sudo systemctl restart nginx

브라우저에서 https://mirror.example.com에 접속하면 자물쇠 아이콘이 표시되며 HTTPS가 제대로 작동하는 걸 확인할 수 있어요!


3. 인증서 자동 갱신 설정하기

Let's Encrypt 인증서는 90일마다 만료돼요.

수동으로 갱신하기에는 번거롭죠?

Certbot으로 자동 갱신을 설정해줄 수 있어요!


기본 Cron 작업 확인

Certbot 설치 시 자동 갱신 Cron 작업이 추가돼 있어요! 확인해보세요.

sudo crontab -l

출력에 다음과 비슷한 내용이 있다면 이미 설정된 거예요!

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

매일 0시와 12시에 갱신을 시도하고 --quiet으로 불필요한 로그를 줄이고 있어요.


테스트해보기

sudo certbot renew --dry-run

--dry-run은 실제 갱신 없이 시뮬레이션만 합니다. 오류가 없으면 잘 설정된 거예요.


Nginx 재시작 추가

인증서가 갱신돼도 Nginx가 새 인증서를 적용하려면 재시작이 필요해요!

Cron에 재시작 명령을 추가해볼게요.

sudo crontab -e

0 0,12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl restart nginx"

--post-hook은 갱신 후 Nginx를 재시작해 새 인증서를 적용해주는 옵션이에요.


4. 보안 강화 팁

HTTPS를 조금 더 안전하게 만들기 위한 몇 가지 설정을 추가해보세요.


Diffie-Hellman 파라미터 생성

sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

Nginx 설정에 다음 내용 추가

ssl_dhparam /etc/nginx/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

적용!

sudo nginx -t && sudo systemctl restart nginx

보안 점수 확인해보기!

Qualys SSL Labs에서 도메인을 테스트해 A 등급 이상인지 확인해보는건 어때요?

    Tag -

Loading script...