En este post explicaré cómo crear un certificado Let’s Encrypt en Apache, esto puede ser muy útil en ambientes de producción donde no sea posible comprar un certificado comercial.
Instalar Certbot
Para generar un certificado SSL Let’s Encrypt es necesario instalar los paquetes certbot y python3-certbot-apache:
apt install certbot python3-certbot-apache
Configuración del host virtual de Apache
Para generar el certificado SSL, cerbot obtiene los nombres de los dominios configurados en los archivos de configuración de los host virtuales de Apache, cerbot revisa los valores configurados en las directivas ServerName y ServerAlias.
Un archivo de host virtual puede tener la siguiente configuración:
nano /etc/apache2/sites-available/guidocutipa.blog.bo.conf
<VirtualHost *:80>
ServerName guidocutipa.blog.bo
ServerAlias www.guidocutipa.blog.bo
ServerAdmin webmaster@guidocutipa.blog.bo
DocumentRoot /var/www/guidocutipa
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
<Directory /var/www/guidocutipa >
Options All
AllowOverride FileInfo All
Order allow,deny
Allow from All
</Directory>
</VirtualHost>
Se pueden verificar y aplicar los cambios realizados con los siguientes comandos:
apache2ctl configtest systemctl reload apache2
Habilitar HTTPS en el firewall local
A continuación se muestra la configuración de las reglas de firewal utilizando iptables y ufw.
Habilitar HTTPS en ufw
Primero verificar la configuración actual:
ufw status
A continuación permitir el perfil “Apache Full” que incluye el tráfico de HTTPS y eliminar el perfil “Apache”:
ufw allow 'Apache Full' ufw delete allow 'Apache'
Por último verificar la nueva configuración:
ufw status
Habilitar HTTPS en iptables
Para facilitar la modificación y almacenamientos de la reglas de iptables se puede utilizar la herramienta iptables-persistent.
apt-get install iptables-persistent
Una vez instalado el paquete, se pueden configurar las reglas de la siguiente manera:
iptables -S iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -I INPUT 7 -m state --state NEW -p tcp --dport 443 -j ACCEPT
Para grabar los cambios y hacer que las reglas sean persistentes ejecutar lo siguiente:
netfilter-persistent save
Generar un certificado SSL Let’s Encrypt
Certbot ofrece un complemento de Apache que se encarga de reconfigurar Apache y volver a cargar la configuración cuando sea necesario.
Para realizar este ejemplo se utilizó el dominio guidocutipa.blog.bo
Para iniciar el asistente ejecutar:
certbot --apache
Primero se debe proporcionar un correo electrónico para recibir notificaciones de Let´s Encrypt:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): webmaster@guidocutipa.blog.bo
En el siguiente paso se deben aceptar los términos del servicio:
Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory (A)gree/(C)ancel: A
Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. (Y)es/(N)o: N
En el siguiente paso dejar en blanco y presionar ENTER para crear un certificado para todos los dominios existentes, en caso contrario seleccionar los dominios separados por un espacio o comas y presionar ENTER:
Which names would you like to activate HTTPS for? 1: guidocutipa.blog.bo 2: www.guidocutipa.blog.bo Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel):
Obtaining a new certificate Performing the following challenges: http-01 challenge for guidocutipa.blog.bo http-01 challenge for www.guidocutipa.blog.bo Waiting for verification… Cleaning up challenges Created an SSL vhost at /etc/apache2/sites-available/guidocutipa.blog.bo-le-ssl.conf Deploying Certificate to VirtualHost /etc/apache2/sites-available/guidocutipa.blog.bo-le-ssl.conf Enabling available site: /etc/apache2/sites-available/guidocutipa.blog.bo-le-ssl.conf Deploying Certificate to VirtualHost /etc/apache2/sites-available/guidocutipa.blog.bo-le-ssl.conf
A continuación se debe elegir si se redireccionará todo el tráfico HTTP a HTTPS.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Posteriormente se mostrará el siguiente mensaje:
Redirecting vhost in /etc/apache2/sites-enabled/guidocutipa.blog.bo.conf to ssl vhost in /etc/apache2/sites-available/guidocutipa.blog.bo-le-ssl.conf Congratulations! You have successfully enabled https://guidocutipa.blog.bo and https://www.guidocutipa.blog.bo You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=guidocutipa.blog.bo https://www.ssllabs.com/ssltest/analyze.html?d=www.guidocutipa.blog.bo IMPORTANT NOTES: Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/guidocutipa.blog.bo/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/guidocutipa.blog.bo/privkey.pem Your cert will expire on 2021-01-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. 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
Renovación automática de un certificado Let’s Encrypt
Los certificados Let’s Encrypt son válidos por noventa días, sin embargo, certbot se encarga de las renovaciones al incluir una secuencia de comandos en /etc/cron.d, gestionado por el servicio certbot.timer. Se ejecuta dos veces al día y renovará de forma automática cualquier certificado que caduque en treinta días o menos.
Para verificar el estado del servicio ejecutar:
systemctl status certbot.timer
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2020-10-20 11:01:29 -04; 2h 28min ago Trigger: Tue 2020-10-20 17:37:33 -04; 4h 7min left Triggers: ● certbot.service Oct 20 11:01:29 dozmaz-web-20201017-1510 systemd[1]: Started Run certbot twice daily.
Se puede probar si la renovación automática se realizará sin ningún problema con el siguiente comando:
certbot renew --dry-run
Validación de la configuración
Antes de realizar la validación de la configuración realizada, se sugiere tomar encuenta las recomendaciones para mejorar la seguridad del servidor Apache que se encuentran en los siguientes artículos:
- Seguridad Apache 2.4
- Cómo deshabilitar versiones obsoletas de SSL/TLS en Apache
- Como proteger nuestro servidor Apache: Guía de configuración de Fail2ban
Al finalizar la configuración se puede verificar la configuración con la herramienta: