--- author: Daniel A. Rodriguez date: 2021-09-19 --- # 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 ```bash curl https://get.acme.sh | sh -s email=infra@dominio.edu.ar ``` ó: ```bash 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 sesión actual y volver a abrirla para que el alias surta efecto. Para actualizar: ```bash $ acme.sh --upgrade ``` ## El proceso de certificación El script soporta diferentes [autoridades de certificación](https://github.com/acmesh-official/acme.sh#supported-ca), 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](https://letsencrypt.org/docs/challenge-types/#http-01-challenge): 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 ```bash $ mkdir -p /var/www/le_root/.well-known/acme-challenge ``` Desde la [documentación oficial](https://github.com/acmesh-official/acme.sh) mencionan que no es necesario ser root, aunque es recomendable. ### Un dominio ```bash 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` ```bash 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 ```bash $ mkdir -p /etc/letsencrypt/live/dominio.edu.ar ``` Ejecutamos el script ```bash 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 reload es muy importante. El certificado puede ser renovado automáticamente, pero, sin una orden correcta `reload`  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. ### Listar todos los certificados ```bash $ acme.sh --list ``` En caso que necesites eliminar un certificado SSL ```bash $ acme.sh --remove -d DOMINIO_A_ELIMINAR ``` ### Forzar la renovación de un certificado ```bash $ acme.sh -f -r -d DOMINIO_A_ACTUALIZAR ```