Acme.sh, alternativa a certbot

Acme.sh es un cliente de protocolo ACME sencillo, potente y fácil de usar escrito puramente en lenguaje Shell (shell de Unix), compatible con bash, dash y sh, sin dependencias. Ayuda a gestionar la instalación, renovación y revocación de certificados SSL. Soporta los protocolos ACME versión 1 y 2, así como los certificados comodín ACME v2. La herramienta no requiere acceso root o sudo, pero se recomienda usar root.

Instalación

curl https://get.acme.sh | sh -s email=infra@dominio.edu.ar

O:

wget -O - https://get.acme.sh | sh -s email=infra@dominio.edu.ar

El instalador realizará 3 acciones:

  • Creará y copiará acme.sh en ~/.acme.sh/. Todos los certificados se colocarán también en esta carpeta. Esto se puede modificar con el parámetro --home.
  • Creará un alias: acme.sh=~/.acme.sh/acme.sh.
  • Creará una tarea cron diaria para comprobar y renovar los certificados si es necesario.

Después de la instalación, se debe cerrar la terminal actual y volver a abrirla para que el alias surta efecto.

El proceso

El script soporta diferentes autoridades de certificación, pero nos interesa Let’s Encrypt.

Para que Let’s Encrypt verifique que somos propietarios de dominio.edu.ar, el host tendrá que pasar el desafío de verificación de ACME. Hay varios tipos de desafío, pero el más fácil (creo) es el HTTP-01:

  1. Generará un token de verificación en .well-known/acme-challenge/ del sitio web raíz (supongamos es /var/www/le_root/dominio.edu.ar/) e inicia el desafío
  2. Let’s Encrypt intentará llegar a http://dominio.edu.ar/.well-known/acme-challenge/TOKEN. Si tiene éxito, habrás demostrado que el dominio es tuyo y obtendrás un certificado.

Emitir un certificado

Partimos de la premisa que ya tenemos un servidor web en funcionamiento, y por ello vamos a utilizar el modo webroot. Sólo necesitamos acceso de escritura a la carpeta raíz del sitio web.

Creamos el directorio donde se almacenarán los token

$ mkdir -p /var/www/le_root/.well-known/acme-challenge

Desde la documentación oficial mencionan que no es necesario ser root, aunque es recomendable.

Un dominio

acme.sh --issue -d dominio.edu.ar -w /var/www/le_root --server letsencrypt

Múltiples dominios

Se debe apuntar dominio.edu.ar y www.dominio.edu.ar a la misma carpeta raíz /var/www/le_root/dominio.edu.ar

acme.sh --issue -d dominio.edu.ar -d www.dominio.edu.ar -w /var/www/le_root/dominio.edu.ar

Instalar el certificado en Nginx

Después de generar el certificado, debemos instalar/copiar el certificado en nginx. DEBEMOS usar este comando para copiar los certificados a los archivos de destino, NO hay que usar los archivos de certificados en la carpeta ~/.acme.sh/, son sólo para uso interno, la estructura de la carpeta puede cambiar en el futuro.

Creamos la ruta donde almacenaremos los certificados en producción

$ mkdir -p /etc/letsencrypt/live/dominio.edu.ar

Ejecutamos el script

acme.sh --install-cert -d dominio.edu.ar \
--server letsencrypt \
--key-file /etc/letsencrypt/live/dominio.edu.ar/privkey.pem \
--fullchain-file /etc/letsencrypt/live/dominio.edu.ar/fullchain.pem \
--reloadcmd "systemctl reload nginx"

La propiedad y los permisos de los archivos existentes se conservan. Podemos crear previamente los archivos para definir la propiedad y el permiso.

El certificado se renovará cada 60 días (lo cual es configurable). Una vez renovado el certificado, el servicio nginx se recargará automáticamente con el comando: systemctl reload nginx.

El reloadcmd es muy importante. El certificado puede ser renovado automáticamente, pero, sin una orden correcta ‘reloadcmd’  puede no ser cargado en el servidor, entonces el sitio web no podrá mostrar el certificado renovado en 60 días.

Utilizamos el parámetro --server para especificar a Letsencrypt como autoridad de certificación. El valor predeterminado es ZeroSSL pero, al menos en mi caso, no funcionó.

One thought on “Acme.sh, alternativa a certbot

Comments are closed.