Como validar / corrigir um erro no cron de renovação do Certbot

2

O dia inteiro, estou corrigindo bugs principalmente na área TLS, mas essa questão não é especificamente sobre o TLS.

Bem, eu tenho um servidor web com alguns sites, cada um com seu próprio certificado SSL.

Mas ao ponto, eu consegui instalar o Certbot versão 0.19.0 no meu Debian 9.2 assim:

  1. Adicionando backports às fontes:

    deb http://ftp.debian.org/debian stretch-backports main
    
  2. Instalando a nova versão do Certbot a partir dos backports:

    apt-get install python-certbot-apache -t stretch-backports
    

Depois disso, tive que fazer alguns ajustes importantes no arquivo de renovação, então ficou assim:

# renew_before_expiry = 30 days
version = 0.10.2
archive_dir = /etc/letsencrypt/archive/pavelstriz.cz-0001
cert = /etc/letsencrypt/live/pavelstriz.cz-0001/cert.pem
privkey = /etc/letsencrypt/live/pavelstriz.cz-0001/privkey.pem
chain = /etc/letsencrypt/live/pavelstriz.cz-0001/chain.pem
fullchain = /etc/letsencrypt/live/pavelstriz.cz-0001/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
installer = apache
rsa_key_size = 4096
account = c3f3d026995c1d7370e4d8201c3c11a2
must_staple = True

[[webroot_map]]
pavelstriz.cz = /home/pavelstriz/public_html
www.pavelstriz.cz = /home/pavelstriz/public_html

Consegui renovar o domínio pavelstriz.cz depois disso com:

certbot renew --dry-run

Mas o que me preocupa é o cron do Certbot diário:

# /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(3600))' && certbot -q renew

Não consigo descobrir se funciona de verdade ou como executá-lo com sucesso?

Se eu correr:

/usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

no Bash, diz:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
The requested ! plugin does not appear to be installed

Eu posso ter entendido mal esses comandos.

    
por Vlastimil 19.01.2018 / 16:42

2 respostas

1

O comando atual executado pelo cron é:

test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

Ele começa testando alguns arquivos

test -x /usr/bin/certbot -a \! -d /run/systemd/system

que se traduz em

  • existe /usr/bin/certbot e é executável ( -x /usr/bin/certbot )
  • e não ( -a \! )
  • /run/systemd/system existe e é um diretório ( -d /run/systemd/system )

Se o teste for bem-sucedido, aguarde um número aleatório de segundos ( perl -e 'sleep int(rand(3600))' ) e tente renovar o certificado ( certbot -q renew ).

No entanto, no Debian 9, systemd é instalado por padrão, o que significa que /run/systemd/system existe e é um diretório, então o teste inicial falha e o comando renew nunca é executado.

A renovação real é gerenciada por um temporizador systemd definido no arquivo lib/systemd/system/certbot.timer . A partir da versão 0.27.0-1; seu conteúdo é:

[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

Se o cerbot estiver configurado corretamente, você provavelmente encontrará linhas como

Nov  2 20:06:14 hostname systemd[1]: Starting Run certbot twice daily.
Nov  2 20:06:14 hostname systemd[1]: Started Run certbot twice daily.

no seu syslog .

    
por 02.11.2018 / 20:45
1

I may have misunderstood those commands.

Umm, talvez, um pouco: -)

Esta entrada:

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

Não consigo fazer cara ou coroa. Tudo o que você precisa é, na verdade, algo como:

0 */12 * * * /usr/bin/certbot renew

Ou, se você não quiser receber e-mails de cron :

0 */12 * * * /usr/bin/certbot renew > /dev/null 2>&1

Se você executar (como root ) certbot renew , verá se configurou coisas corretamente ou não:

certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/my.domain.org.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/my.domain.org/fullchain.pem (skipped)
No renewals were attempted.

Você também pode usar o argumento certificates com certbot para exibir informações sobre seus certificados:

certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: my.domain.org
    Domains: my.domain.org
    Expiry Date: 2018-03-14 09:41:09+00:00 (VALID: 53 days)
    Certificate Path: /etc/letsencrypt/live/my.domain.org/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/my.domain.org/privkey.pem
-------------------------------------------------------------------------------
    
por 19.01.2018 / 20:25