> La lista completa de artículos está en [llms.txt](https://docs.f3cloud.com/llms.txt). Cada página tiene versión en Markdown, basta con añadir .md a su dirección. Esta página en Markdown: [https://docs.f3cloud.com/es/software-setup/lets-encrypt-ssl-nginx-apache.md](https://docs.f3cloud.com/es/software-setup/lets-encrypt-ssl-nginx-apache.md).

# Certificado SSL de Let's Encrypt para Nginx y Apache con Certbot

Cómo obtener gratis un certificado SSL de Let's Encrypt con Certbot para una web en Nginx o Apache. Emisión y activación de HTTPS con un solo comando, renovación automática, comprobación de la caducidad, varios dominios y análisis de los errores más frecuentes.

El **certificado SSL** permite que tu web se abra por el protocolo seguro HTTPS. Así los datos entre el visitante y el servidor viajan cifrados, y el navegador muestra un candado junto a la dirección en lugar del aviso «No seguro».

**Let's Encrypt** emite estos certificados gratis, y el programa **Certbot** los obtiene, los conecta por sí solo a Nginx o Apache y después los renueva también por sí solo. Hemos probado todos los comandos de abajo en Debian 12, y en Ubuntu funcionan igual.

***

### Qué necesitas antes de empezar

* Un **dominio** cuyo registro A apunte a la dirección IP del servidor. Puedes comprobarlo con el comando `getent hosts example.com`, que debe mostrar la IP de tu servidor.
* La **web ya se abre** en `http://tu-dominio` con Nginx o Apache. Cómo configurar Nginx lo contamos en un [artículo aparte](https://docs.f3cloud.com/es/software-setup/nginx-installation.md).
* El **puerto 80** abierto, ya que Let's Encrypt verifica el dominio precisamente a través de él. Si tienes activado el cortafuegos, abre los puertos 80 y 443 como se muestra en el artículo [sobre el cortafuegos](https://docs.f3cloud.com/es/client-area/protect-vps-from-unauthorised-access/firewall.md).

> **Si el dominio tiene un registro AAAA.**
>
> Let's Encrypt verifica primero el dominio por IPv6. Si el registro AAAA apunta a otro servidor o la web no está configurada para IPv6, la verificación fallará. Pon en el registro AAAA la dirección IPv6 de este servidor o elimínalo.

***

### 1. Instala Certbot

#### Nginx

```bash
# Instalamos Certbot y su módulo para Nginx
apt update && apt install -y certbot python3-certbot-nginx
```

#### Apache

```bash
# Instalamos Certbot y su módulo para Apache
apt update && apt install -y certbot python3-certbot-apache
```

***

### 2. Emite el certificado

Un solo comando obtiene el certificado, lo conecta a la web y activa la redirección de `http://` a `https://`. Con `-d` indica todas las direcciones de la web, normalmente el dominio con `www` y sin él.

#### Nginx

```bash
certbot --nginx -d example.com -d www.example.com
```

<figure><img src="https://docs.f3cloud.com/img/ssl-nginx-issue.png" alt="Emisión correcta del certificado con certbot --nginx"><figcaption><p>Certificado emitido y conectado a Nginx</p></figcaption></figure>

#### Apache

```bash
certbot --apache -d example.com -d www.example.com
```

<figure><img src="https://docs.f3cloud.com/img/ssl-apache-issue.png" alt="Emisión correcta del certificado con certbot --apache"><figcaption><p>Certificado emitido y conectado a Apache</p></figcaption></figure>

La primera vez que lo ejecutes, Certbot te hará algunas preguntas:

1. **Correo electrónico** – ahí te llegarán los avisos importantes sobre la cuenta.
2. **Condiciones de Let's Encrypt** – escribe `Y` para aceptarlas.
3. **Boletín de la EFF** – es opcional, puedes responder `N`.

Si al final aparece `Congratulations! You have successfully enabled HTTPS`, ya está todo listo. Abre la web en `https://tu-dominio`, y junto a la dirección aparecerá el candado.

Certbot ha añadido por sí solo las líneas necesarias a la configuración de la web, y están marcadas con el comentario `# managed by Certbot`. En Nginx es el archivo de la web en `/etc/nginx/sites-available`.\
En Apache aparecerá, junto a tu archivo, uno nuevo terminado en `-le-ssl.conf`.

***

### 3. Comprueba el certificado

```bash
# Mostramos todos los certificados del servidor
certbot certificates
```

<figure><img src="https://docs.f3cloud.com/img/ssl-certificates.png" alt="Lista de certificados con la fecha de caducidad"><figcaption><p>Al certificado le quedan 89 días de validez</p></figcaption></figure>

En la línea **Expiry Date** se ve la fecha de caducidad.\
Entre paréntesis, `VALID` indica cuántos días más será válido el certificado.

Debajo están las rutas a los archivos del certificado y de la clave, por si los necesitas para otros programas.

***

### 4. Asegúrate de que la renovación funciona

Los certificados de Let's Encrypt se emiten por poco tiempo. Ahora son 90 días, y de aquí a 2028 Let's Encrypt irá reduciendo el plazo hasta los 45 días. No tienes que renovar nada a mano. Certbot revisa los certificados dos veces al día y renueva por sí solo los que están a punto de caducar.

Comprueba que la renovación funcionará con una ejecución de prueba. No cambia nada en el servidor.

```bash
# Renovación de prueba de todos los certificados
certbot renew --dry-run
```

<figure><img src="https://docs.f3cloud.com/img/ssl-renew-dry-run.png" alt="Renovación de prueba del certificado completada con éxito"><figcaption><p>La renovación de prueba ha salido bien</p></figcaption></figure>

Si al final aparece `Congratulations, all simulated renewals succeeded`, el certificado se renovará solo.

***

### Varios dominios en un mismo servidor

Ejecuta Certbot por separado para cada web, indicando sus dominios. Para añadir una dirección nueva a un certificado ya emitido, indica todas las direcciones antiguas más la nueva y añade la opción `--expand`.

```bash
# Añadimos el subdominio shop al certificado de example.com
certbot --nginx --expand -d example.com -d www.example.com -d shop.example.com
```

> **Límites de Let's Encrypt.**
>
> Un mismo conjunto de dominios se puede emitir como máximo 5 veces en 7 días.\
> Se permiten como máximo 5 verificaciones fallidas por hora para un mismo dominio.
>
> Por eso, si algo no sale bien, busca primero la causa en la sección de abajo y solo después vuelve a ejecutar Certbot.

***

### Obtener un certificado sin tocar la configuración del servidor

Si quieres conectar el certificado a mano o lo necesita otro programa, usa `certonly`. Certbot solo obtendrá el certificado y no cambiará nada en la configuración.

#### Con Nginx o Apache

```bash
# Certbot pasa la verificación por sí solo a través del servidor web en marcha.
# Para Apache, sustituye --nginx por --apache
certbot certonly --nginx -d example.com
```

#### Con la carpeta de la web

```bash
# Sirve para cualquier servidor web. Indica en -w la carpeta
# desde la que la web sirve sus archivos
certbot certonly --webroot -w /var/www/example.com -d example.com
```

#### Sin servidor web

```bash
# Certbot ocupará por sí solo el puerto 80 durante un momento. Si en él
# funciona un servidor web, detenlo primero
certbot certonly --standalone -d example.com
```

Los archivos listos están en la carpeta `/etc/letsencrypt/live/example.com/`. El archivo `fullchain.pem` es el certificado.\
El archivo `privkey.pem` es la clave privada, y no debes pasársela a nadie.

***

### Errores frecuentes

<details>

<summary>Timeout during connect (likely firewall problem)</summary>

Let's Encrypt no ha podido conectarse al servidor por el puerto 80. Casi siempre lo bloquea el cortafuegos. Abre los puertos 80 y 443 y vuelve a ejecutar Certbot. Para comprobar si el servidor web escucha en el puerto 80, usa el comando `ss -tlnp | grep ':80 '`.

</details>

<details>

<summary>DNS problem: NXDOMAIN looking up A</summary>

El dominio no tiene registro A. Añádelo en tu registrador de dominios con la dirección IP del servidor. Un registro nuevo no empieza a funcionar al instante, y a veces hay que esperar un poco. Comprueba el resultado con el comando `getent hosts example.com` y solo después ejecuta Certbot.

</details>

<details>

<summary>unauthorized: Invalid response … 404</summary>

Let's Encrypt ha abierto el dominio, pero no ha encontrado el archivo de verificación. Normalmente el dominio apunta a otro servidor, por ejemplo porque el registro A se quedó del hosting anterior o el registro AAAA apunta a otro sitio. Compara la IP del DNS con la IP de tu servidor. Si usas `--webroot`, comprueba que en `-w` está la carpeta desde la que la web sirve sus archivos.

</details>

<details>

<summary>Could not automatically find a matching server block</summary>

El certificado se ha obtenido, pero Certbot no ha encontrado en la configuración de Nginx ninguna web con ese dominio. Añade el dominio a la directiva `server_name` de la configuración de la web, compruébala con el comando `nginx -t`, recarga Nginx y conecta el certificado ya emitido con el comando `certbot install --cert-name example.com`.

</details>

<details>

<summary>too many certificates o too many failed authorizations</summary>

Se han alcanzado los límites de Let's Encrypt, y hay que esperar a que se restablezcan.\
El límite de verificaciones fallidas dura una hora.\
El límite de reemisión dura una semana.

Para depurar la configuración con calma, ejecuta Certbot con la opción `--dry-run`, porque las ejecuciones de prueba no cuentan para los límites reales.

</details>

<details>

<summary>El certificado ha caducado y no se ha renovado solo</summary>

Renuévalo a mano con el comando `certbot renew` y mira si aparecen errores. Lo más habitual es que se trate de uno de los problemas de arriba, por ejemplo el puerto 80 cerrado. Para comprobar que el temporizador de renovación está activado, usa el comando `systemctl list-timers | grep certbot`.\
Los detalles de las últimas ejecuciones se guardan en el archivo `/var/log/letsencrypt/letsencrypt.log`.

</details>

<details>

<summary>¿Se puede obtener un certificado para todos los subdominios a la vez?</summary>

Sí, es un certificado wildcard del tipo `*.example.com`. Pero en ese caso Let's Encrypt verifica el dominio mediante un registro DNS y no a través de la web, así que los métodos de este artículo no sirven. Normalmente es más sencillo emitir el certificado para los subdominios que necesitas con varias opciones `-d`.

</details>

***

### Nuestros recursos

**Canal de Telegram:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Web del hosting:** [https://f3cloud.com](https://f3cloud.com/es)
