개요
오늘 포스팅에서는 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 등급 이상인지 확인해보는건 어때요?