O Certbot não força o Apache2 a ler certificados recém-gerados

1

Sistema: GNU / Linux Debian 9.5 sem cabeça.

Situação & Pergunta

Acabei de pegar o certificado Vamos Criptografar para gerar novamente o certificado SSL, mas não recarreguei o Apache2. Isso resultou em um meio dia não funcionando domínio. Eu quero automatizar isso. Como fazer isso?

Este é o meu arquivo CRON atual do Certbot /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
    
por Vlastimil 28.10.2018 / 03:08

3 respostas

1

Normalmente, costumo evitar reiniciar os serviços apenas para reiniciá-los, por vários motivos. Então aconselho apenas reiniciar o Apache quando o certificado for renovado .

Para o certbot, parece que você pode reiniciar o apache2 quando o certificado for renovado colocando um crontab:

certbot renew --renew-hook "apachectl -k graceful"

Você também pode encontrar a data em que você tem um novo certificado e só reiniciar o Apache.

Apenas para uma introdução ao tema, é assim que você pode verificar um certificado X.509 começando a data de validade:

$ openssl x509 -startdate -noout -in ZscalerChain.crt 
notBefore=Jan  6 22:36:34 2015 GMT

ou para o período da época:

$ date --date $(openssl x509 -startdate -noout -in ZscalerChain.crt | awk -F"=" ' { print $2 } ') +%s
1420583794

Ou você pode trapacear e verificar as datas dos arquivos. Então, algo semelhante a isto:

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

Ou verificar a data de início do certificado 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

Existem outras maneiras de fazer isso. Por exemplo, se for de extrema importância reiniciar o Apache assim que o certificado for renovado, você poderá monitorar a alteração do arquivo com inotify e agir de acordo.

    
por 28.10.2018 / 13:00
2

Isso pode ser feito simplesmente adicionando:

&& apachectl -k graceful

para o comando diário do Certbot.

Desta forma, duas vezes por dia:

  • Os certificados serão verificados para expiração e, se expirarem, serão renovados.

  • O Apache será recarregado. O Apache avisará seus threads para sair quando ociosos e, em seguida, o apache recarregará a configuração.

por 28.10.2018 / 03:08
1

Acabei de encontrar outra maneira de fazer isso, e IMHO esta é a mais conveniente.

  1. Vá para o diretório de configuração de criptografia Vamos criptografar:

    # cd /etc/letsencrypt/renewal
    
  2. Edite o arquivo de configuração do domínio desejado com o editor de texto escolhido.

  3. Assegure-se de que nesta seção:

    [renewalparams]
    

    existem ganchos para o Apache stop / start:

    pre_hook = service apache2 stop
    post_hook = service apache2 start
    

    Isso deve garantir que o Apache2 seja interrompido antes do início do processo de renovação e também que ele seja iniciado posteriormente.

por 28.10.2018 / 16:59