Nginx 서버에서 Let's Encrypt SSL 인증서를 Certbot을 사용하여 자동으로 갱신하는 방법을 자세히 안내합니다.
다양한 리눅스 배포판(우분투 계열, Redhat 계열)에서의 설치부터 Crontab 설정, 갱신 후크, 문제 해결까지 완벽하게 설명합니다.

SSL 인증서의 중요성
웹사이트 보안은 현대 인터넷 환경에서 더 이상 선택이 아닌 필수 요소가 되었습니다. SSL 인증서는 사용자와 웹 서버 간의 통신을 암호화하여 데이터를 안전하게 보호하고, 웹사이트의 신뢰성을 높이는 핵심 도구입니다.
Let's Encrypt는 무료로 SSL 인증서를 제공하는 인기 있는 서비스로, 웹 보안의 대중화에 크게 기여하고 있습니다. 그러나 Let's Encrypt 인증서는 90일마다 만료되므로, 자동 갱신 설정이 필수적입니다.
이 글에서는 Nginx 서버에서 Certbot을 사용하여 Let's Encrypt SSL 인증서를 자동으로 갱신하는 방법을 상세히 알아보겠습니다.

사전 준비사항
이 가이드를 따라하기 전에 다음 사항이 준비되어 있어야 합니다:
- Nginx가 설치된 서버
- 도메인 이름과 DNS 설정 완료
- 서버에 대한 SSH 접근 권한
- 루트(sudo) 권한
※ SSL [ Let's Encrypt] 사이트 구경 가기 ☜

1단계: Certbot 설치하기
Certbot은 Let's Encrypt 인증서를 쉽게 발급받고 관리할 수 있게 해주는 도구입니다. 다양한 리눅스 배포판에 따라 설치 방법이 다릅니다.
Ubuntu/Debian 시스템
sudo apt update
sudo apt install certbot python3-certbot-nginx
CentOS/RHEL 시스템
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx
Fedora 시스템
sudo dnf install certbot python3-certbot-nginx
2단계: Nginx 서버 설정
SSL 인증서를 적용하기 전에 Nginx 설정 파일을 수정해야 합니다. 일반적으로 설정 파일은 /etc/nginx/sites-available/ 또는 /etc/nginx/
디렉토리에 있습니다.
sudo nano /etc/nginx/sites-available/default
또는
sudo vi /etc/nginx/sites-available/default
다음과 같이 설정 파일을 수정합니다:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
# Let's Encrypt 인증을 위한 경로 설정
location /.well-known/acme-challenge/ {
root /var/www/html;
}
# HTTP에서 HTTPS로 리다이렉트
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
각 설정 항목 설명:
- listen 80: 80번 포트(HTTP)로 들어오는 요청을 처리합니다.
- server_name your_domain.com: 자신의 도메인으로 변경해야 합니다.
- location /.well-known/acme-challenge/: Let's Encrypt의 도메인 소유권 확인을 위한 경로입니다.
- return 301 https://$host$request_uri: HTTP 요청을 HTTPS로 리디렉션합니다.
- listen 443 ssl: 443번 포트(HTTPS)로 들어오는 요청을 처리합니다.
- ssl_certificate, ssl_certificate_key: SSL 인증서와 개인 키 파일의 경로입니다.
- proxy_pass: 백엔드 서버로 요청을 전달합니다 (필요에 따라 수정).
설정을 저장하고 Nginx 설정이 올바른지 확인한 후 재시작합니다:
sudo nginx -t # 설정 문법 검사
sudo systemctl restart nginx
3단계: Let's Encrypt 인증서 발급
이제 Certbot을 사용하여 인증서를 발급받을 차례입니다. 다음 명령어를 실행합니다:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
이 명령어는 다음 작업을 수행합니다:
- 도메인 소유권 확인 (ACME 챌린지)
- 인증서 발급
- Nginx 설정 파일 자동 수정
- HTTPS 리디렉션 설정 (선택 시)
Certbot은 대화형 프롬프트를 통해 몇 가지 질문을 할 것입니다. 이메일 주소를 입력하고 약관에 동의하면 인증서 발급이 진행됩니다.
4단계: 자동 갱신 설정
Let's Encrypt 인증서는 90일 후에 만료되므로 자동 갱신 설정이 필요합니다. 두 가지 방법으로 설정할 수 있습니다.
방법 1: Crontab을 사용한 설정
Crontab을 사용하여 정기적인 인증서 갱신을 설정합니다:
sudo crontab -e
다음 내용을 추가합니다:
0 3 * * * /usr/bin/certbot renew --quiet --renew-hook="systemctl reload nginx"
이 설정은 매일 오전 3시에 인증서 갱신을 시도하고, 갱신이 성공하면 Nginx를 재시작합니다.
방법 2: Systemd Timer를 사용한 설정 (최신 리눅스 배포판)
최신 리눅스 배포판에서는 Certbot이 자동으로 systemd timer를 설정합니다. 다음 명령어로 확인할 수 있습니다:
systemctl list-timers | grep certbot
갱신 후 Nginx를 재시작하는 후크를 추가하려면 다음 파일을 생성합니다:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
파일 내용:
#!/bin/bash
systemctl reload nginx
파일에 실행 권한 부여:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
5단계: 갱신 테스트
설정이 제대로 작동하는지 테스트하기 위해 다음 명령어를 실행합니다:
sudo certbot renew --dry-run
이 명령어는 실제로 인증서를 갱신하지 않고 갱신 프로세스를 시뮬레이션합니다. 오류 없이 완료되면 자동 갱신 설정이 올바르게 된 것입니다.
고급 설정: 여러 도메인 관리
여러 도메인을 관리하는 경우, 각 도메인에 대해 별도의 서버 블록을 설정하고 인증서를 발급받을 수 있습니다. 예를 들어:
sudo certbot --nginx -d domain1.com -d www.domain1.com -d domain2.com -d www.domain2.com
또는 각 도메인마다 별도의 인증서를 발급받을 수도 있습니다:
sudo certbot --nginx -d domain1.com -d www.domain1.com
sudo certbot --nginx -d domain2.com -d www.domain2.com
SSL 설정 강화
보안을 더욱 강화하기 위해 Nginx SSL 설정을 최적화할 수 있습니다:
server {
listen 443 ssl http2;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
# SSL 최적화 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 보안 헤더 추가
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
이 설정은 최신 암호화 프로토콜과 암호를 사용하고, OCSP 스테이플링을 활성화하며, 보안 헤더를 추가하여 웹사이트의 보안을 강화합니다.
문제 해결
인증서 갱신 실패 시
- Certbot 로그 확인:
sudo cat /var/log/letsencrypt/letsencrypt.log
- 수동으로 갱신 시도:
sudo certbot renew --force-renewal
- Nginx 설정 오류 확인:
sudo nginx -t
인증서 경로 문제
Nginx 설정 파일에서 인증서 경로가 올바른지 확인하세요:
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
Let's Encrypt 레이트 리밋 문제
Let's Encrypt는 일정 기간 내에 발급할 수 있는 인증서 수에 제한이 있습니다. 테스트 시에는 --dry-run
옵션을 사용하여 실제 발급 없이 테스트하세요.

추가 팁
- 테스트 환경 구성: 실제 서버에 적용하기 전에 테스트 환경에서 먼저 설정을 시도해보세요.
- 백업: 인증서와 설정 파일을 정기적으로 백업하세요.
- 와일드카드 인증서: 여러 서브도메인이 있다면 와일드카드 인증서 사용을 고려하세요.
sudo certbot --nginx -d example.com -d *.example.com
- Certbot 명령어 옵션:
certbot --help
명령어를 사용하여 Certbot의 모든 옵션을 확인할 수 있습니다. - 인증서 정보 확인: 다음 명령어로 인증서 정보를 확인할 수 있습니다.
sudo certbot certificates
2021.10.05 - [Cloud 개발] - let's encrypt 자동 갱신 설정 - 초간단 방법입니다.
2021.10.05 - [Cloud 개발] - Let's Encrypt ssl 적용 - 무료 SSL 인증서 설치 (apache https 설치)
'Cloud 개발' 카테고리의 다른 글
무료 ChatGpt 사용 가능한 Genspark 완벽 가이드: 장단점 분석과 Plus 무료 이용 방법 (4) | 2025.03.23 |
---|---|
챗GPT 할인 계정 공유 사이트 비교: GamsGo, GoingBus, 그리고 NFXBUS 프로모션 (0) | 2025.03.18 |
Grok AI 무료 플랜 100% 활용법: 비용 없이 AI 서비스 극대화하기 (0) | 2025.03.07 |
AI 기술로 작곡도 가능하다? 인공지능 음악 작곡 프로그램 알아보기 (3) | 2025.02.22 |
wordpress 설치 후 테마 및 plugin 사이트 접속 오류 (1) | 2025.02.21 |