LetsEncrypt cambió el mundo de los certificados SSL cuando su oferta de certificados SSL gratuitos y de corta duración permitió a una gran cantidad de personas y compañías proteger sus aplicaciones web sin costo alguno. Con este servicio, debería existir la infraestructura necesaria y, con ese fin, surgieron una gran cantidad de aplicaciones que se ajustan a las necesidades de emisión de SSL.
Una de las utilidades más habituales es la de CertBot
, que puede funcionar bien, pero otra aplicación open source que está habilitada es acme.sh
. Este es un cliente ACME (el protocolo utilizado por LetsEncrypt para emitir certificados SSL) absolutamente basado en shell. Con una gran cantidad de funciones avanzadas integradas, este cliente posibilita configuraciones complejas.
La forma más sencilla de instalar [acme.sh](<http://acme.sh>)
es el siguiente, que descarga y ejecuta el script desde aquí, https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh
.
curl <https://get.acme.sh> | sh
La fuente de ese sitio se encuentra aquí, si desea verificar qué está haciendo el script real
La instalación descargará y moverá los archivos a ~/.acme.sh
e instale un alias en su ~/.bashrc
expediente. Al mismo tiempo, se instalará un trabajo cron si está habilitada.
Primeros pasos
Mucho de cómo lo utilizas [acme.sh](<http://acme.sh>)
depende del método y la aplicación para los que solicita el certificado. Acme.sh ofrece muchos métodos diferentes para solicitar un certificado, como:
En este post, voy a demostrar dos formas diferentes de solicitar un certificado. Incluyo configuraciones de servidor web para NGINX y Apache, que utiliza el método Webroot. El método del modo DNS utiliza un archivo de configuración para crear registros CNAME que se usan para verificar el dominio, en lugar de crear un archivo en el sistema de archivos.
Configuración del servidor web
Configuración de NGINX LetsEncrypt
NGINX facilita la creación de una configuración compartida para utilizar cuando se utiliza el webroot
método de solicitud de un certificado.
letsencrypt.conf
Se recomienda crear una configuración independiente que se pueda incluir según sea necesario en las configuraciones de vhost, así: include /etc/nginx/letsencrypt.conf
# Rule for legitimate ACME Challenge requests (like /.well-known/acme-challenge/xxxxxxxxx)
# We use ^~ here, so that we don't check other regexes (for speed-up). We actually MUST cancel
# other regex checks, because in our other config files have regex rule that denies access to files with dotted names.
location ^~ /.well-known/acme-challenge/ {
# Set correct content type. According to this:
# <https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29>
# Current specification requires "text/plain" or no content header at all.
# It seems that "text/plain" is a safe option.
default_type "text/plain";
}
# Direct access returns a 404
location = /.well-known/acme-challenge/ {
return 404;
}
apache
Del mismo modo que NGINX, Apache puede crear un archivo de configuración independiente. A continuación se muestra un ejemplo de esta configuración.
/etc/apache2/conf-available/letsencrypt.conf
Para este caso, la configuración de Apache es específica del host virtual debido a la necesidad de incluir la ubicación del disco. La próxima es una ubicación común, pero puede diferir según su configuración específica.
Alias /.well-known/acme-challenge/ "/var/www/html/.well-known/acme-challenge/"
<Directory "/var/www/html/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
Configuración de DNS
En este post, estoy demostrando el modo DNS usando Cloudflare, dado que ofrece cambios de DNS extremadamente rápidos y funciona excepcionalmente bien con este método.
Acme.sh utiliza dos variables ambientales para el dns_cf
método: CF_Key
y CF_Email
. Para incluir esto en su entorno al inicio, puede incluir esta configuración dentro de su .bashrc
expediente.
Puede que no sea evidente, pero hay un espacio antes de cada comando de exportación, lo que de forma general garantiza que no se leerán en el historial, por si acaso.
export CF_Key="#########..."
export CF_Email="[email protected]"
Emitir certificado a través del método Webroot
Al emitir el siguiente comando, se definen dos dominios en un solo certificado. Esto es para asegurarse de que cuando se solicite cualquiera de los nombres de host (y a menudo se redirija al canónico), la solicitud seguirá protegida por una conexión segura.
acme.sh --issue -d example.com -d www.example.com -w /var/www/html
Los certificados emitidos están en /.acme.sh/acme.sh/{domain_name}
Emitir certificado a través del método DNS
Cuando se utiliza el método de emisión de DNS, un txt
El registro se crea a través de la API de Cloudflare y LetsEncrypt verifica el dominio usando ese registro temporal. Este es un método más limpio, dado que no webroot
se necesita configuración.
# Multiple Domains
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
Los certificados emitidos están en /.acme.sh/acme.sh/{domain_name}
Certificado renovable
Por defecto, Acme.sh, creará un cronjob
como la próxima entrada:
48 0 * * * "/home/user/.acme.sh/acme.sh" --cron --home "/home/user/.acme.sh" > /dev/null
Para forzar una renovación, puede emitir el siguiente comando, que utilizará el mismo método de emisión que se utilizó originalmente:
acme.sh --renew -d example.com -d www.example.com
Borrar certificados
Si ya no desea renovar un certificado, es muy fácil de quitar. A pesar de esto, esto no elimina el certificado del disco. Para hacer eso, deberá navegar a ~/.acme.sh/
y elimine el directorio que contiene los certificados.
acme.sh --remove -d example.com -d www.example.com
Esto posibilita limpiar los certificados que están configurados para la renovación, que puede verificar enumerando los certificados de la próxima manera:
acme.sh --list
Conclusión
LetsEncrypt ofrece un servicio excelente y fácil de utilizar para el aprovisionamiento de certificados SSL para su uso en sitios web. Crear un portal web seguro es más fácil que nunca y utilizar el acme.sh cliente significa que tiene control total acerca de cómo ocurre esto en su servidor web.
Con bastantes métodos diferentes para obtener un certificado, inclusive los métodos muy seguros, como un dominio delegado, posibilitan recuperar correctamente los certificados necesarios.