Guido Cutipa

Cómo obtener un certificado SSL Let’s Encrypt en Apache

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 suparados 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 copn 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:

Al finalizar la configuración se puede verificar la configuración con la herramienta:

https://www.ssllabs.com/ssltest/analyze.html

Salir de la versión móvil