
Quiero preguntar si es posible utilizar Certbot para una configuración semiautomática donde la infraestructura subyacente esté controlada pora míy no por Certbot.
Entiendo que Certbot se comunicará con Let's Encrypt para emitir un desafío, que es básicamente un token que Certbot necesitará encontrar en mi dirección IP o mi DNS.
Tengo control total del servidor Apache, pero es una configuración de alojamiento múltiple muy personalizada (¡se requiere SNI!) y no quiero que Certbot estropee mi configuración de Apache, ni que se ejecute como root. Volveremos a los sudoers más tarde.
Ya configuré el espacio de hosting para mta-sts.example.org
, mientras estoy implementandoEstricta seguridad de transporte del agente de transferencia de correo
Le he dicho a Apache, usando una macro, que ese /home/djechelon/srv/www/domains/mta-sts.example.org
es mi espacio de trabajo.
- htdocs: contenido servido a través de HTTP
- htdocs-secure: contenido servido a través de HTTPS
- registros: registros de Apache VHost
- ssl: aquí es donde
mta-sts.example.org.{key,crt,ca_bundle?}
existe
Me gustaría decirle a Certbot que haga lo siguiente por mí
- Obtén el desafío de LE
- Escriba el desafío en el archivo correspondiente
/home/djechelon/..../htdocs
y Apache estará listo para servirlo. - Pídale a LE que valide el desafío, porque Apacheeslisto para cumplir el desafío
- Escribir certificado a
/home/djechelon/..../ssl/
. Si LE no proporciona ca_bundle, no hay problema, es opcional en mi lugar. - Emitir recarga de Apache (probablemente habrá una configuración de sudoers pronto)
Entendí que necesito usar el webroot
complemento en este caso, pero me costaba encontrar ayuda en la línea de comandos para todas las opciones, incluido dónde almacenar los archivos y los certificados.
La documentación supone que el proceso es interactivo, por lo que tendría que copiar el archivo de desafío manualmente y pedirle a Certbot que se comunique con LE para la validación del dominio.
Creo que debería haber una forma sencilla de ejecutar el script simple anterior, que se ejecuta bajo el supuesto de que existe la infraestructura de TI general (por ejemplo, si realmente desea ejecutar su propio software de servidor) y está bien configurada.
¿Alguna ayuda?
[Editar] Logré invocar esto de forma interactiva por ahora
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
Lo cual me pidió el directorio webroot y el correo electrónico (algo que me hubiera encantado pasar como parámetro para futuras renovaciones). Entonces ahora la pregunta puede ser "¿cómo puedo volver a ejecutar esto en el futuro de forma no interactiva con cron?"
Respuesta1
No almacenaría los certificados en el directorio de inicio del usuario ( /home/djechelon/..../ssl/
) porquesi el usuario elimina los archivos del certificado, Apache no se inicia. Estoy de acuerdo con su razonamiento de que es mejor si Certbot no interfiere con la configuración del servidor web, pero actualmente parece que está causando efectivamente el mismo problema que está tratando de evitar y, por eso, estoy tratando de advertirle.
No hay razón para usar el directorio de inicio para desafíos HTTP-01 ni archivos de registro, y también es posible usar una configuración estática con Apache, usando Certbot en el certonly
modo como ya lo hace.
Mi solución para las renovaciones automáticas es utilizar el mismo directorio de trabajo para todos los desafíos 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
De esta manera es posible agregar un global Alias
que maneje todos los desafíos, pero también es posible colocarlo solo en los hosts virtuales donde sea necesario:
<IfModule alias_module>
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>
Respuesta2
Probablemente el modo interactivo deba ejecutarse sólo una vez. Certbot recuerda dónde se almacenan los certificados y esto siempre está en el directorio de trabajo.
No tan mal. Mi solución fue reemplazar /home/djechelon/srv/..../ssl/*
con enlaces simbólicos.
En breve:
- Configura el hosting virtual como de costumbre
- Utilice el comando para obtener un nuevo certificado para el nuevo sitio web
- Vuelva a cargar Apache (lo necesito para configurar el host virtual)
- Al renovar, use solo
certbot renew
el directorio de trabajo adecuado para ejecutar como no root
comando de emisión
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 renovación (quizás se pueda cron
-ned)
certbot renew --work-dir [non-root-workdir --logs-dir [non-root-workdir] --config-dir [non-root-workdir]
Al renovar, por supuesto, se debe programar una recarga de Apache como mínimo.