시스템: GNU/Linux Debian 9.5 헤드리스.
상황과 문제
방금 SSL 인증서를 재생성하기 위해 Let's Encrypt Certbot을 잡았지만 Apache2를 다시 로드하지 않았습니다. 이로 인해 도메인이 반나절 동안 작동하지 않게 되었습니다. 나는 이것을 자동화하고 싶다. 우리는 그것에 대해 무엇을 할 수 있나요?
이것은 내 현재 Certbot CRON 파일입니다 /etc/cron.d/certbot
.
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
답변1
나는 일반적으로 여러 가지 이유로 서비스를 다시 시작하기 위한 목적으로 서비스를 다시 시작하는 것을 피하는 경향이 있습니다. 따라서 Apache를 다시 시작하는 것이 좋습니다.인증서 업데이트 후.
certbot의 경우 인증서를 업데이트할 때 apache2를 다시 시작하고 crontab에 넣을 수 있는 것 같습니다.
certbot renew --renew-hook "apachectl -k graceful"
새 인증서를 받은 날짜를 찾아 Apache를 다시 시작할 수도 있습니다.
주제를 소개하기 위해 다음을 통해 X.509 인증서의 유효 시작 날짜를 확인할 수 있습니다.
$ openssl x509 -startdate -noout -in ZscalerChain.crt
notBefore=Jan 6 22:36:34 2015 GMT
또는 에포크 시간:
$ date --date $(openssl x509 -startdate -noout -in ZscalerChain.crt | awk -F"=" ' { print $2 } ') +%s
1420583794
아니면 속여서 파일 날짜를 확인할 수도 있습니다. 그래서 다음과 같습니다.
FILE=~/tmp/savedate
CERT=~/yourcert.crt
if [ ! -f $FILE ]
then
touch --date="last year" $FILE
fi
DATE1=$(date -r $FILE +%s)
DATE2=$(date -r $CERT +%s)
if [ $DATE2 > $DATE1 ]
then
touch $FILE
sudo apachectl -k graceful
fi
또는 X.509 인증서 시작 날짜를 확인하세요.
FILE=~/tmp/savedate
CERT=~/yourcert.crt
if [ ! -f $FILE ]
then
touch --date="last year" $FILE
fi
DATE1=$(date -r $FILE +%s)
DATE2=$(date --date $(openssl x509 -startdate -noout -in $CERT | awk -F"=" ' { print $2 } ') +%s)
if [ $DATE2 > $DATE1 ]
then
touch $FILE
sudo apachectl -k graceful
fi
이를 수행하는 다른 방법이 있습니다. 예를 들어, 인증서를 업데이트한 후 즉시 Apache를 다시 시작해야 하는 경우 inotify
대신 파일의 변경 사항을 모니터링하고 그에 따라 조치를 취할 수 있습니다.
답변2
이는 다음을 추가하여 간단하게 수행할 수 있습니다.
&& apachectl -k graceful
일일 Certbot 명령.
따라서 하루에 두 번:
인증서의 만료 여부를 확인하고 만료된 경우 갱신됩니다.
Apache가 다시 로드됩니다. Apache는 유휴 상태일 때 스레드가 종료되도록 제안한 다음 Apache가 구성을 다시 로드합니다.
답변3
방금 IMHO가 가장 편리한 다른 방법을 찾았습니다.
Let's Encrypt 갱신 구성 디렉터리를 입력합니다.
# cd /etc/letsencrypt/renewal
선택한 텍스트 편집기를 사용하여 필수 도메인 구성 파일을 편집합니다.
이 섹션에서 다음을 확인하세요.
[renewalparams]
Apache 중지/시작에는 후크가 있습니다.
pre_hook = service apache2 stop post_hook = service apache2 start
이렇게 하면 업데이트 프로세스가 시작되기 전에 Apache2가 중지되고 이후에 시작되도록 해야 합니다.