Generar un certificado SSL wildcard con Let’s Encrypt

En un servidor de preproducción habitualmente uso un dominio propio para poder tener cada proyecto con un subdominio. Por ejemplo:

  • comercioelectronico1.example.com
  • webapp5.example.com

En estos proyectos quiero tener un certificado SSL válido para cada proyecto.

La primera opción que se me ocurre es crear un certificado SSL para cada proyecto cada vez que lo necesite. Pero hay una solución mejor: crear un certificado wildcard, válido para todos los subdominios dentro de un dominio, y olvidarme de crear más certificados para esos subdominios. Let’s Encrypt, la popular autoridad de certificación, nos proporciona esta funcionalidad.

En este artículo voy a explicar cómo llevar a cabo la creación de este certificado SSL wildcard en un Linux Debian 10, aunque hacerlo en otros sistemas Linux va a ser similar.

Parto de que tengo instalado «certbot», el software que me permite gestionar los certificados Let’s Encrypt: crearlos, renovarlos, modificarlos, revocarlos,… Si no lo tienes instalado puedes seguir estas indicaciones para instalarlo.

La versión de Certbot que tengo instalada en el servidor es la 0.31.0.

$ sudo certbot --version
certbot 0.31.0

A continuación ejecuto el comando de generación del certificado. Está creado para el dominio example.com y para la dirección de correo electrónico admin@example.com:

$ sudo certbot certonly \
--manual \
--preferred-challenges=dns \
--email admin@example.com \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos \
-d *.example.com

Los parámetros del comando son los siguientes:

  • certonly: obtiene o renueva un certificado, pero no lo instala.
  • manual: obtiene el certificado de forma interactiva.
  • preferred-challenges=dns: es la forma en la que le indico a Let’s Encrypt que controlo en dominio (con DNS). Para ello me pedirá que cree un registro DNS de tipo TXT en mi dominio.
  • email: dirección de correo electrónico para notificaciones importantes relacionadas con el certificado.
  • server: el servidor de Let’s Encrypt contra el que se ejecutarán todas las operaciones.
  • agree-tos: acepto los términos de servicio de Let’s Encrypt.
  • d: dominio para el que quiero obtener el certificado. Fíjate que lleva un asterisco, lo que indica que va a ser wildcard.

El comando es interactivo. Tengo que ir respondiendo unas cuantas preguntas. La primera es si quiero compartir mi correo con la EFF para que me envíen información sobre su trabajo.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None

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

A continuación me indica que la IP desde la que estoy ejecutando el comando será almacenada en registros púbicos y me pregunta si estoy de acuerdo con esto.

Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.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

A continuación me pide que cree un registro DNS de tipo TXT para mi dominio.

Tengo que ir al proveedor donde tengo registrado mi dominio o donde tengo el servicio de DNS (normalmente es la misma empresa) y crear ese registro _acme-challenge.example.com con el valor que me indica KgZgEbDHUj3Zs-H4THSdCzU6z1GFmAyJw8psyAGEbqg.

Una vez creado este registro espero unos minutos a que se propague el cambio antes de continuar, ya que si el servidor de Let’s Encrypt no es capaz de leer este registro, tendré que empezar el proceso de nuevo.

Puedes comprobar si el registro TXT está progrado en DNS Checker o en MX Toolbox.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

KgZgEbDHUj3Zs-H4THSdCzU6z1GFmAyJw8psyAGEbqg

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

Ahora el servidor de Let’s Encrypt comprueba el registro TXT y, si es correcto, genera el certificado wildcard.


Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-09-01. 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

Y ya está, tengo el certificado wildcard creado para usarlo con múltiples subdominios.

Si has llegado hasta aquí, no te olvides añadir la renovación del certificado en el cron del root. Esto lo haces con la siguiente línea, que tratará de ejecutar la renovación todas las noches a las 5 de la madrugada:

00 5 * * * /usr/bin/certbot renew

11 comments

  1. Excelente ya seguí el tutorial y todo excelente. Quisiera realizarte una consulta, ya que esto de generar mis propios certificados es nuevo para mí:
    ¿cuando realizo esto no necesito descargar el código del certificado y aplicarlo en la sección correspondiente del hosting?

  2. Muchas gracias el tutorial es muy útil, siguiendo los pasos se instala el certificado sin ningún problema. Pero me quedé con una duda, y es sobre la renovación. ¿Será posible que se pudiera ampliar un poco este tema?

  3. Muy bien explicado, me vino genial para crear los certificado de tipo wildcard.
    Me uno a la duda de Oscar, en cuanto a la renovación como hemos creado el certificado de tipo manual con DNS, tocara volver a configurar unos DNS diferentes, o se autorenueva sin tener que modificar nada más?

    Muchas gracias de antemano

  4. También tengo duda con la renovación, podrías explicarlo por favor.
    00 5 * * * /usr/bin/certbot renew
    Este cron lo renueva sin tener que configurar el dns nuevamente?

  5. Segui los pasos y todo correcto, bien explicado todo, pero a la hora de renovar no me renueva por hacerlo de forma manual. Como podría hacerlo. ?

  6. Para apache2:
    “`
    cd /etc/letsencrypt/live/tudominio.com/
    cp ./fullchain.pem /etc/ssl/certs/ssl-cert-snakeoil.pem
    cp ./privkey.pem /etc/ssl/private/ssl-cert-snakeoil.key
    systemctl restart apache2
    “`

  7. Muchas Gracias!! aun funciona ok el procedimiento!!

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.