Tutorial

Cómo proteger Apache con Let's Encrypt en Ubuntu 20.04

Published on May 21, 2020
Default avatar

By Erika Heidi

Developer Advocate

Español
Cómo proteger Apache con Let's Encrypt en Ubuntu 20.04

Introducción

Let’s Encrypt es una entidad de certificación (CA) que facilita la obtención y la instalación de certificados TLS/SSL gratuitos y, de ese modo, habilita HTTPS cifrado en servidores web. Simplifica el proceso al proporcionar un cliente de software, Certbot, que intenta automatizar la mayoría (cuando no todos) de los pasos requeridos. Actualmente, todo el proceso de obtención e instalación de un certificado está totalmente automatizado en Apache y Nginx.

En esta guía, utilizaremos Certbot para obtener un certificado SSL gratuito para Apache en Ubuntu 20.04 y nos asegurarnos de que esté configurado para renovarse de forma automática.

En este tutorial, se utiliza un archivo de host virtual separado en lugar del archivo de configuración predeterminado de Apache para configurar el sitio web que se protegerá con Let’s Encrypt. Recomendamos crear nuevos archivos de host virtual de Apache para cada dominio que se aloje en un servidor, ya que permite evitar errores comunes y mantiene los archivos de configuración predeterminados como configuración de reserva.

Requisitos previos

Para este tutorial, necesitará lo siguiente:

  • Un servidor de Ubuntu 20.04 configurado conforme a este tutorial de configuración inicial de servidores para Ubuntu 20.04, así como un non-root user y un firewall.

  • Un nombre de dominio registrado por completo. En este tutorial, se utilizará your_domain como ejemplo. Puede adquirir un nombre de dominio en Namecheap, obtener uno gratuito en Freenom o utilizar un registrador de dominios de su elección.

  • Los dos registros DNS que se indican a continuación se han configurado para su servidor. Puede utilizar esta introducción al DNS de DigitalOcean para obtener más información sobre cómo agregarlos.

    • Un registro A con your_domain orientado a la dirección IP pública de su servidor.
    • Un registro A con www.your_domain orientado a la dirección IP pública de su servidor.
  • Apache instalado conforme a Cómo instalar Apache en Ubuntu 20.04. Compruebe que tenga un archivo de host virtual para su dominio. En este tutorial, se utilizará /etc/apache2/sites-available/your_domain.conf como ejemplo.

Paso 1: Instalar Certbot

Para obtener un certificado SSL con Let’s Encrypt, primero, debemos instalar el software Certbot en su servidor. Para hacerlo, utilizaremos los repositorios de paquetes predeterminados de Ubuntu.

Necesitamos dos paquetes: certbot y python3-certbot-apache. Este último es un complemento que integra Certbot con Apache, lo que permite automatizar la obtención de certificados y configurar HTTPS dentro de su servidor web con un solo comando.

  1. sudo apt install certbot python3-certbot-apache

También se le solicitará que confirme la instalación de Apache pulsando Y y ENTER.

Ahora, tiene Certbot instalado en su servidor. En el siguiente paso, verificaremos la configuración de Apache para asegurarnos de que su host virtual esté configurado de forma adecuada. Esto garantizará que la secuencia de comandos del cliente certbot pueda detectar sus dominios y vuelva a configurar su servidor web para que utilice su certificado SSL recién creado de forma automática.

Paso 2: Comprobar la configuración del host virtual de Apache

Para poder obtener y configurar un certificado SSL de forma automática para su servidor web, Certbot debe poder encontrar el host virtual adecuado entre los archivos de configuración de Apache. Los nombres de dominio de su servidor se obtendrán de las directivas ServerName y ServerAlias definidas en su bloque de configuración de VirtualHost.

Si siguió el paso de configuración del host virtual en el tutorial de instalación de Apache, debe tener un bloque VirtualHost establecido para su dominio en /etc/apache2/sites-available/your_domain.conf con las directivas ServerName y ServerAlias ya configuradas de forma adecuada.

Para comprobarlo, abra el archivo de host virtual de su dominio con nano o su editor de texto preferido:

  1. sudo nano /etc/apache2/sites-available/your_domain.conf

Busque las líneas de ServerName y ServerAlias existentes. Deberían tener el siguiente aspecto:

/etc/apache2/sites-available/your_domain.conf
...
ServerName your_domain
ServerAlias www.your_domain
...

Si ya tiene su ServerName y ServerAlias configuradas de esta manera, puede salir del editor de texto y continuar con el siguiente paso. Si utiliza nano, puede salir escribiendo CTRL+X y, luego, Y y ENTER para confirmar.

Si la configuración del host virtual no coincide con la del ejemplo, actualícela correspondientemente. Cuando termine, guarde el archivo y salga del editor. Luego, ejecute el siguiente comando para validar sus cambios:

  1. sudo apache2ctl configtest

Debería obtener Syntax OK como respuesta. Si encuentra un mensaje de error, vuelva a abrir el archivo de host virtual y verifique que no haya errores ortográficos y que no falten caracteres. Cuando la sintaxis del archivo de configuración sea correcta, vuelva a cargar Apache para que los cambios surtan efecto:

  1. sudo systemctl reload apache2

Con estos cambios, Certbot podrá encontrar el bloque VirtualHost correcto y actualizarlo.

A continuación, actualizaremos el firewall para permitir el tráfico de HTTPS.

Paso 3: Habilitar HTTPS a través del firewall

Si tiene habilitado el firewall de UFW, como se recomienda en las guías de los requisitos previos, deberá ajustar la configuración para permitir el tráfico de HTTPS. Cuando se instala, Apache registra algunos perfiles de aplicación UFW diferentes. Podemos aprovechar el perfil Apache Full para permitir tanto tráfico de HTTP como de HTTPS en su servidor.

Para verificar el tipo de tráfico que se permite actualmente en su servidor, puede utilizar lo siguiente:

  1. sudo ufw status

Si siguió una de nuestras guías de instalación de Apache, su resultado debe tener un aspecto similar al siguiente, lo que significa que actualmente solo se permite tráfico de HTTP en el puerto 80:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

Para permitir el perfil “Apache Full”, además de tráfico de HTTPS, y eliminar el perfil “Apache” redundante, haga lo siguiente:

  1. sudo ufw allow 'Apache Full'
  2. sudo ufw delete allow 'Apache'

Su estado debe tener el siguiente aspecto:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)

Ahora, está listo para ejecutar Certbot y obtener sus certificados.

Paso 4: Obtener un certificado SSL

Certbot ofrece varias alternativas para obtener certificados SSL a través de complementos. El complemento de Apache se encargará de reconfigurar Apache y volver a cargar la configuración siempre que sea necesario. Para utilizar este complemento, escriba lo siguiente:

  1. sudo certbot --apache

Esta secuencia de comandos le solicitará que responda a una serie de preguntas para configurar su certificado SSL. Primero, le solicitará una dirección de correo electrónico válida. Esta dirección se utilizará para las notificaciones de renovación y los avisos de seguridad:

Output
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): you@your_domain

Después de proporcionar una dirección de correo electrónico válida, presione ENTER para continuar con el siguiente paso. Luego, se le solicitará que confirme si acepta las condiciones de servicio de Let’s Encrypt. Puede confirmar pulsando A y, luego, ENTER:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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

A continuación, se le solicitará que confirme si desea compartir su dirección de correo electrónico con Electronic Frontier Foundation para recibir noticias y otra información. Si no desea suscribirse a su contenido, escriba N. De lo contrario, escriba Y. Luego, presione ENTER para continuar con el siguiente paso.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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, se le solicitará que informe a Certbot los dominios para los que desea activar HTTPS. Los nombres de dominio enumerados se obtienen de forma automática de la configuración del host virtual de Apache, por lo tanto, es importante que se asegure de que los ajustes de ServerName y ServerAlias estén configurados correctamente en su host virtual. Si desea habilitar HTTPS para todos los nombres de dominio enumerados (recomendado), puede dejar la solicitud en blanco y presionar ENTER para continuar. De lo contrario, seleccione los dominios para los que desea habilitar HTTPS enumerando cada número correspondiente, separado por comas o espacios, y, luego, presionando ENTER.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Verá un resultado como este:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your_domain
http-01 challenge for www.your_domain
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/your_domain-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/your_domain-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf

A continuación, se le solicitará que seleccione si desea que el tráfico de HTTP se redirija a HTTPS o no. En la práctica, esto significa que cuando alguien visite su sitio web a través de canales no cifrados (HTTP), se lo redirigirá automáticamente a la dirección HTTPS de su sitio web. Seleccione 2 para habilitar el redireccionamiento o 1 si desea mantener HTTP y HTTPS como métodos de acceso al sitio web separados.

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

Con este paso, se completa la configuración de Certbot y se le presentarán los comentarios finales sobre su certificado nuevo e información sobre dónde localizar los archivos generados y cómo probar su configuración utilizando una herramienta externa que analiza la autenticidad del certificado:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://your_domain and
https://www.your_domain

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
https://www.ssllabs.com/ssltest/analyze.html?d=www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your_domain/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your_domain/privkey.pem
   Your cert will expire on 2020-07-27. 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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

Ahora, su certificado está instalado y cargado en la configuración de Apache. Intente volver a cargar su sitio web utilizando https:// y observe el indicador de seguridad de su navegador. Debe indicar que su sitio está protegido debidamente, en general, con un icono de candado en la barra de direcciones.

Puede utilizar la prueba de servidores de SSL Labs para verificar la categoría de su certificado y obtener información detallada sobre él, desde la perspectiva de un servicio externo.

En el siguiente y final paso, probaremos la función de renovación automática de Certbot, que garantiza que su certificado se renueve automáticamente antes de la fecha de expiración.

Paso 5: Verificar la renovación automática de Certbot

Los certificados de Let’s Encrypt son válidos únicamente por noventa días. Este período de validez se utiliza para alentar a los usuarios a automatizar su proceso de renovación de certificados, así como para garantizar que los certificados mal utilizados o las claves robadas expiren lo antes posible.

El paquete certbot que instalamos se encarga de las renovaciones al incluir una secuencia de comandos en /etc/cron.d, que gestiona un servicio systemctl denominado certbot.timer. Esta secuencia de comandos se ejecuta dos veces al día y renovará de forma automática cualquier certificado que caduque en treinta o menos días.

Para verificar el estado de este servicio y asegurarse de que esté activo y en ejecución, puede utilizar lo siguiente:

  1. sudo systemctl status certbot.timer

Verá un resultado similar a este:

Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago Trigger: Wed 2020-04-29 23:50:31 UTC; 12h left Triggers: ● certbot.service Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.

Para probar el proceso de renovación, puede hacer un simulacro con certbot:

  1. sudo certbot renew --dry-run

Si no ve errores, no habrá inconvenientes. Cuando sea necesario, Certbot renovará sus certificados y volverá a cargar Apache para registrar los cambios. Si el proceso de renovación automática falla, Let’s Encrypt enviará un mensaje a la dirección de correo electrónico que especificó en el que se le advertirá cuándo se aproxime la fecha de vencimiento de sus certificados.

Conclusión

En este tutorial, instaló el cliente certbot de Let’s Encrypt, configuró e instaló un certificado SSL para su dominio y confirmó que el servicio de renovación automática de Certbot esté activo en systemctl. Si tiene preguntas adicionales sobre la utilización de Certbot, la documentación es un buen punto de partida.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar

Developer Advocate

Dev/Ops passionate about open source, PHP, and Linux.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
3 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Excelente aporte mejor manera de explicarlo imposible, muchas gracias

Excelente aporte.

Gracias por el aporte y la traducción, me ha servido para configurar correctamente el entorno.

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel