기존에 docker를 이용해서 ssl 인증서를 발급받았다.
# ssl 다운
docker run -it --rm \
-v /root/letsencrypt:/etc/letsencrypt \
-v /var/www/certbot:/var/www/certbot \
certbot/certbot certonly --webroot \
-w /var/www/certbot \
-d [도메인주소]
90일만 유효하며 만료일 30일 전부터 갱신이 가능하다. 수동으로 갱신하기 위해서는 아래 명령어로 실행 가능하다.
docker run -it --rm
-v /root/letsencrypt:/etc/letsencrypt
-v /var/www/certbot:/var/www/certbot
certbot/certbot renew
그러나 매번 다시 들어올 수는 없으므로 crontab을 이용해서 재발급을 자동화한다.
1. sh 파일 만들기
원하는 위치에 아래 sh 파일 생성 (vim [원하는위치]/renew-ssl.sh)
현재 docker로 nginx를 띄워놔서 nginx에서 파일을 reload하는 명령어를 함께 실행한다.
#!/bin/bash
# 로그 파일 설정
LOG_FILE="/root/letsencrypt/renewal.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] 인증서 갱신 시작" >> $LOG_FILE
# 인증서 갱신 시도
docker run --rm \
-v /root/letsencrypt:/etc/letsencrypt \
-v /var/www/certbot:/var/www/certbot \
certbot/certbot renew >> $LOG_FILE 2>&1
# 갱신 결과 확인
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] 인증서 갱신 성공 또는 갱신 필요 없음" >> $LOG_FILE
# 웹 서버 재시작 또는 리로드 (nginx 예시)
# systemctl reload nginx
# 또는 Docker를 사용하는 경우:
docker exec [nginx-container-이름] nginx -s reload
echo "[$TIMESTAMP] 웹 서버 재시작 완료" >> $LOG_FILE
else
echo "[$TIMESTAMP] 인증서 갱신 실패" >> $LOG_FILE
fi
2. sh 파일 실행 권한 부여
chmod +x /root/renew-ssl.sh
3. script 테스트
/root/renew-ssl.sh
직접 renew를 진행해보고
cat /root/letsencrypt/renewal.log
로그 파일에서 정상적으로 실행되었는지 확인한다.
4. crontab에 등록하기
crontab -e
로 crontab 설정을 열고 아래 줄을 입력한다.
# 매월 1, 15일 3:30에 ssl 인증서 renew 시도
30 3 1,15 * * /root/renew-ssl.sh
매월 1, 15일에 실행되지만 실제 renew는 만료일 30일 전에만 가능해서 날짜가 되면 renew가 진행될 것이다.