Let’s Encrypt es una Autoridad Certificadora (CA) que proporciona de manera sencilla la obtención de certificados TLS/SSL gratuitos, permitiendo así la conexión cifrada entre el navegador del cliente y el servidor remoto usando el protocolo seguro de transferencia de hipertexto (HTTPS); el puerto estándar para este protocolo es el 443 TCP.
Desde Let's Encrypt recomiendan que la mayoría de las personas con acceso shell usen el cliente ACME llamado Certbot. Éste puede automatizar la emisión e instalación de certificados y también tiene modos de expertos para personas que no quieren de una autoconfiguración.
Si Certbot no cumple con tus necesidades, hay muchos otros clientes ACME para escoger. Una vez hayas escogido un cliente ACME, ve la documentación para ese cliente para proceder.
En este tutorial mostraremos cómo instalar Certbot para añadir certificados para NGINX, Apache y LiteSpeed como servidor web de forma automática y manual para diferentes distribuciones Linux.
Para un sistema Windows puedes seguir nuestro artículo Instalar certificado Let’s Encrypt en Windows Server y si el servidor tiene instalado un panel como por ejemplo Plesk, cPanel y HestiaCP utiliza el procedimiento correspondiente:
- Cómo configurar Let’s Encrypt en HestiaCP
- Cómo configurar Let's Encrypt en Plesk
- Cómo configurar AutoSSL de cPanel
Requisitos y pasos previos
Es necesario tener acceso a la shell con root o con permisos sudo en el servidor o servidores VPS con Nginx o Apache instalado para utilizar este artículo. También tienes que tener un dominio adquirido y que esté apuntando a unos DNS como por ejemplo los servidores de nombre de Clouding. Además, tu dominio tiene que tener los registros necesarios tipo A para que el proceso de creación del certificado funcione correctamente (Tipos de registro DNS).
En este artículo, en particular usaremos de ejemplo los registros ejemplo.com y www.ejemplo.com. Si quieres crear un certificado para ellos es necesario tener un registro para cada uno.
Para un certificado Wildcard es necesaria la creación de un registro durante el proceso de obtención, para más información visualiza su apartado correspondiente.
Instalación de Certbot
Hay varios métodos de instalación para cerbot, en este caso explicamos con apt y snapd. Pero si no tienes instalado snapd o no lo vas a utilizar en un futuro, te recomendamos la segunda opción con apt (Advanced Packaging Tool) que viene por defecto en las distribuciones GNU/Linux para no consumir recursos innecesarios o yum en caso de CentOS.
Instalación para NGINX:
Instala paquetes necesarios:
# apt update && apt install certbot python3-certbot-nginx
Para versiones posteriores como Ubuntu 16 o Debian 8 el paquete es python-cerbot-nginx.
Instalación para Apache:
Instala paquetes necesarios:
# apt update && apt install certbot python3-certbot-apache
Para versiones posteriores como Ubuntu 16 o Debian 8 el paquete es python-certbot-apache.
Instalación para LiteSpeed o otros:
En el caso de LiteSpeed no tiene paquete oficial para la autoconfiguración, así como otros servidores Web. Por lo tanto solo deberás instalar el paquete únicamente Certbot:
# apt update && apt install certbot
Instalación para NGINX:
Instala paquetes necesarios:
# yum update && yum install certbot python3-certbot-nginx
Para versiones posteriores de CentOS 7 el paquete es python-cerbot-nginx.
Instalación para Apache:
Instala paquetes necesarios:
# yum update && yum install certbot python3-certbot-apache
Para versiones posteriores de CentOS 7 el paquete es python-certbot-apache.
Instalación para LiteSpeed:
En el caso de LiteSpeed no tiene paquete oficial para la autoconfiguración. Por lo tanto solo deberás instalar el paquete únicamente Certbot:
# yum update && yum install certbot
# apt update && apt install snapd && snap install core; snap refresh coreEn caso de un CentOS habrá que sustituir apt por yum y activarlo de esta forma:
# yum update && yum install snapd && systemctl enable --now snapd.socket && snap install core; snap refresh coreInstala Certbot con snap:
# snap install --classic certbotVerifica la instalación del enlace simbólico:
# ln -s /snap/bin/certbot /usr/bin/certbot
Adquirir certificado SSL para dominio o subdominio
Configuración automática (recomendado):
Certifica y modifica automáticamente la configuración de Nginx:# certbot --nginx -d example.com -d www.ejemplo.com
Confirma que se ha realizado correctamente la autoconfiguración accediendo a tu registro con HTTPS desde un navegador y que aparezca el certificado.
También puedes utilizar SSL Checker o un SSL Server Test para verificar el certificado Let's Encrypt.
Configuración manual:
Certificar únicamente (sin modificar la configuración de Nginx):
# certbot certonly --nginx -d example.com -d www.ejemplo.com
En este caso deberás realizar una configuración manual de los ficheros de Nginx para añadir la ubicación de los certificados. Debes modificar los siguientes valores de la configuración del protocolo https (443) por las siguientes ubicaciones:
ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
Como también una redirección del puerto 80 TCP (HTTP) hacia 443 TCP (HTTPS) en el apartado correspondiente si lo deseas. Ejemplo:
server {
if ($host = ejemplo.com) {
return 301 https://$host$request_uri;
}
listen 80 ;
listen [::]:80 ;
server_name ejemplo.com;
return 404;
}
Configuración automática (recomendado):
Certifica y modifica automáticamente la configuración de Apache:# certbot --apache -d example.com -d www.ejemplo.com
Confirma que se ha realizado correctamente la autoconfiguración accediendo a tu registro con HTTPS desde un navegador y que aparezca el certificado.
También puedes utilizar SSL Checker o un SSL Server Test para verificar el certificado Let's Encrypt.
Configuración manual:
Certificar únicamente (sin modificar la configuración de Apache):
# certbot certonly --apache -d example.com -d www.ejemplo.com
Ejemplo de fichero de configuración de Apache para HTTPS:
<IfModule mod_ssl.c>
<VirtualHost *:443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
ServerName ejemplo.com
SSLCertificateFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ejemplo.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Ejemplo de redirección de HTTP a HTTPS para configuración de site de apache:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =ejemplo.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# certbot certonly --webroot -w /usr/local/lsws/ejemplo.com/html/ -d example.com -d www.ejemplo.com
Configuración mediante Webadmin de LiteSpeed
Una vez realizado indica en la configuración la ubicación de los certificados para el dominio en cuestión. Si tienes acceso al Webadmin puedes realizarlo desde el apartado SSL del correspondiente virtualhost del dominio en cuestión:
Private Key File | /etc/letsencrypt/live/ejemplo.com/privkey.pem |
Certificate File | /etc/letsencrypt/live/ejemplo.com/fullchain.pem |
Recuerda adicionalmente que tienes que habilitar el Listener por el puerto 443 si no lo tienes habilitado previamente, mapear el dominio e indicar la conexión como segura:
En el apartado SSL añade un certificado para poder configurar el SSL y soportando los protocolos necesarios, como aparece en las capturas siguientes:
Luego en Virtual Hosts configura el certificado:
Adicionalmente puedes activar y crear una regla para el redireccionamiento:
Regla para redirección:
rewriteCond %{HTTPS} !on
rewriteCond %{HTTP:X-Forwarded-Proto} !https
rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Configuración manual de LiteSpeed
En caso de no utilizar CyberPanel edita el fichero de configuración del servicio web para crear o modificar el Listener:
# vi /usr/local/lsws/conf/httpd_config.conf
Un ejemplo para añadir o modificar el Listener e indicar la ubicación de un certificado con mapeado de vhosts:
listener HTTPS {
address *:443
secure 1
keyFile /etc/letsencrypt/live/ejemplo.com/privkey.pem
certFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
certChain 1
sslProtocol 31
map ejemplo ejemplo.com
map ejemplo2 ejemplo2.com
}
Luego deberás modificar también la configuración del vhost o vhosts (Creando previamente el listener mapeado):
# vi /usr/local/lsws/conf/vhosts/ejemplo.com/vhconf.conf
Un ejemplo del fichero de configuración del vhost con redireccionamiento de HTTP a HTTPS:
docRoot $VH_ROOT/html/
rewrite {
enable 1
autoLoadHtaccess 1
rules <<<END_rules
rewriteCond %{HTTPS} !on
rewriteCond %{HTTP:X-Forwarded-Proto} !https
rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
END_rules
}
vhssl {
keyFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
certFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
}
Opciones adicionales e informativas
Comprobar o configurar auto renovación
Certbot configura automáticamente la renovación de certificados con un temporizador y no es necesario realizar ninguna acción adicional. Por lo tanto, lo siguiente es solo informativo.
Simular una renovación de prueba:
# certbot renew --dry-run
Comprobar el estado del servicio de temporizador de Certbot:
# systemctl status certbot.timer
Para listar los trabajos:
# systemctl list-timers
Debe aparecer el siguiente configurado para la renovación automática:
certbot.timer - certbot.service
Y en el caso de haber instalado Certbot con snapd, aparecerá esto:
snap.certbot.renew.timer - snap.certbot.renew.service
También puedes desactivar el servicio certbot.timer para renovarlo mediante una tarea programada. En ese caso ejecuta un crontab:
# crontab -e
Añadimos lo siguiente:
00 00 */1 * * certbot renew
Con esta configuración realizará una comprobación cada día a las 00:00 y procederá a renovarlo en caso necesario.
Adquirir certificado Wildcard con Certbot
Ejecuta el siguiente comando modificando el correo electrónico válido para adquirir un certificado Wildcard:
# certbot certonly --manual --preferred-challenges=dns --email usuario@ejemplo.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos
Pedirá la introducción del dominio a certificar, indícalo utilizando *. más el dominio que deseas certificar para obtener el Wildcard:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): *.ejemplo.es
Luego preguntará si estás de acuerdo con que se almacene la dirección IP en sus registros; deberás aceptarlo con "Y":
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for ejemplo.com
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Por último, pedirá realizar un registro _acme-challenge tipo TXT en nuestro proveedor de servidores de nombres con el contenido que nos indica:
Please deploy a DNS TXT record under the name
_acme-challenge.ejemplo.com with the following value:
3wkWcAfmf1NvzCgtVSsaSqAaiDf26y3xZLuegXm-uHkaA
Before continuing, verify the record is deployed.
Press Enter to Continue
Crea el registro en tu proveedor DNS y espera que se propaguen los cambios. Puedes verificarlo con un nslookup, dig o visualizar el progreso en DNS Checker por ejemplo. Una vez propagado continúa pulsando Enter:
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/ejemplo.com-0001/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/ejemplo.com-0001/privkey.pem
Your cert will expire on 2021-08-04. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
En este caso deberás también configurar el certificado en la configuración, para más información revisa el apartado anterior para la configuración manual del servicio utilizado. Adicionalmente, podrás exportarlo para utilizarlo en otros servidores que tengan alojados subdominios del mismo dominio (no renovará automáticamente).