Operação semimanual do Certbot

Operação semimanual do Certbot

Quero perguntar se é possível usar o Certbot para uma configuração semiautomática onde a infraestrutura subjacente é controlada pormeue não pelo Certbot.

Entendo que o Certbot se comunicará com o Let's Encrypt para emitir um desafio, que é basicamente um token que o Certbot precisará encontrar no meu endereço IP ou no meu DNS.

Tenho controle total do servidor Apache, mas é uma configuração de multi-hospedagem muito customizada (é necessário SNI!) E não quero que o Certbot bagunce minha configuração do Apache, nem que seja executado como root. Voltaremos aos sudoers mais tarde.

Já configurei o espaço de hospedagem para mta-sts.example.org, pois estou implementandoSegurança de transporte estrita do agente de transferência de correio

Eu disse ao Apache, usando uma macro, que esse /home/djechelon/srv/www/domains/mta-sts.example.orgé meu espaço de trabalho

  • htdocs: conteúdo servido por HTTP
  • htdocs-secure: conteúdo servido por HTTPS
  • registros: registros do Apache VHost
  • SSL: é aqui que mta-sts.example.org.{key,crt,ca_bundle?}existe

Eu gostaria de dizer ao Certbot para fazer o seguinte por mim

  1. Obtenha o desafio de LE
  2. Escreva o desafio no arquivo apropriado em /home/djechelon/..../htdocse o Apache estará pronto para atendê-lo
  3. Peça ao LE para validar o desafio, porque o Apacheépronto para servir o desafio
  4. Escreva o certificado para /home/djechelon/..../ssl/. Se LE não fornecer ca_bundle sem problemas, é opcional na minha casa
  5. Emitir recarregamento do Apache (provavelmente haverá uma configuração de sudoers em breve)

Entendi que preciso usar o webrootplugin neste caso, mas estava com dificuldades para encontrar ajuda na linha de comando para todas as opções, incluindo onde armazenar os arquivos e os certificados.

A documentação pressupõe que o processo é interativo, então eu teria que copiar o arquivo de desafio manualmente e pedir ao Certbot para entrar em contato com LE para validação de domínio.

Acredito que deveria haver uma maneira simples de executar o script simples acima, que é executado sob a suposição de que a infraestrutura geral de TI existe (por exemplo, você realmente deseja executar seu próprio software de servidor) e está bem configurada.

Qualquer ajuda?

[Editar] Consegui invocar isso de forma interativa por enquanto

 certbot certonly --webroot -d mta-sts.example.org --preferred-challenges http --work-dir /home/djechelon/etc/letsencrypt --logs-dir /home/djechelon/letsencrypt-logs --config-dir /home/djechelon/etc/letsencrypt

Que me pediu o diretório webroot e o email (algo que eu adoraria passar como parâmetro para futuras renovações). Portanto, agora a questão pode ser "como executar isso novamente no futuro de forma não interativa com o cron?"

Responder1

Eu não armazenaria os certificados no diretório inicial do usuário ( /home/djechelon/..../ssl/) porquese o usuário remover os arquivos de certificado, o Apache não será iniciado. Concordo com o seu raciocínio de que é melhor que o Certbot não mexa na configuração do servidor web, mas atualmente parece que você está efetivamente causando o mesmo problema que está tentando evitar e, portanto, estou tentando avisá-lo.

Não há razão para usar o diretório inicial para desafios HTTP-01 nem arquivos de log, e também é possível usar uma configuração estática com o Apache, usando o Certbot no certonlymodo como você já faz.

Minha solução para renovações automáticas é usar o mesmo diretório de trabalho para todos os desafios HTTP-01 (de /etc/letsencrypt/renewal/example.com.conf):

# renew_before_expiry = 30 days
version = 0.31.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
server = https://acme-v02.api.letsencrypt.org/directory
account = 0123456789abcdef0123456789abcdef
rsa_key_size = 4096
[[webroot_map]]
example.com = /var/www/letsencrypt
www.example.com = /var/www/letsencrypt

Desta forma é possível adicionar um global Aliasque lide com todos os desafios, mas também é possível colocá-lo apenas nos hosts virtuais onde for necessário:

<IfModule alias_module>
    Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>

Responder2

Provavelmente o modo interativo deve ser executado apenas uma vez. O Certbot lembra onde os certificados estão armazenados e isso está sempre no diretório de trabalho.

Não tão ruim assim. Minha solução foi substituir /home/djechelon/srv/..../ssl/*por links simbólicos

Resumidamente:

  1. Configure a hospedagem virtual normalmente
  2. Use o comando para obter um novo certificado para o novo site
  3. Recarregue o apache (preciso disso para configurar o host virtual)
  4. Na renovação, use apenas certbot renewcom o diretório de trabalho adequado para executar como não-root

Comando de emissão

 certbot certonly --webroot -d mta-sts.example.org --preferred-challenges http --work-dir [non-root-workdir --logs-dir [non-root-workdir] --config-dir [non-root-workdir]

Comando de renovação (pode ser cron-ned talvez)

 certbot renew --work-dir [non-root-workdir --logs-dir [non-root-workdir] --config-dir [non-root-workdir]

Na renovação, é claro, deve-se agendar uma recarga do Apache no mínimo

informação relacionada