
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
- Obtenha o desafio de LE
- Escreva o desafio no arquivo apropriado em
/home/djechelon/..../htdocs
e o Apache estará pronto para atendê-lo - Peça ao LE para validar o desafio, porque o Apacheépronto para servir o desafio
- Escreva o certificado para
/home/djechelon/..../ssl/
. Se LE não fornecer ca_bundle sem problemas, é opcional na minha casa - Emitir recarregamento do Apache (provavelmente haverá uma configuração de sudoers em breve)
Entendi que preciso usar o webroot
plugin 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 certonly
modo 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 Alias
que 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:
- Configure a hospedagem virtual normalmente
- Use o comando para obter um novo certificado para o novo site
- Recarregue o apache (preciso disso para configurar o host virtual)
- Na renovação, use apenas
certbot renew
com 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