Certificado SSL en Proxmox con Cloudflare
Cómo reemplazar el certificado autofirmado de Proxmox por uno válido de Let's Encrypt usando el DNS Challenge de Cloudflare
Si tienes Proxmox en tu homelab, sabrás muy bien de qué hablo: cada vez que abres la interfaz web, el navegador te recibe con una advertencia de sitio no seguro. Esto ocurre porque Proxmox genera un certificado autofirmado por defecto, que técnicamente no es de confianza para ningún navegador. La solución más elegante para esto es obtener un certificado válido de Let’s Encrypt, y la forma más sencilla de hacerlo sin exponer Proxmox a internet es a través del DNS Challenge de Cloudflare.
También existe la opción de usar un reverse proxy como Nginx Proxy Manager y gestionar el certificado desde ahí, pero la interfaz web de Proxmox no se comporta bien detrás de uno según mi experiencia, así que lo descartaremos por ahora.
¿Qué vamos a hacer?
Proxmox incluye soporte nativo para ACME (el protocolo detrás de Let’s Encrypt) y permite configurar plugins de DNS para realizar el challenge. Utilizaremos el plugin de Cloudflare, que valida que somos dueños del dominio agregando temporalmente un registro TXT en nuestro DNS, sin necesidad de abrir ningún puerto al exterior.
El flujo es el siguiente:
- Proxmox le pide a Let’s Encrypt un certificado para nuestro dominio.
- Let’s Encrypt responde con un challenge: “crea este registro TXT en tu DNS”.
- Proxmox usa la API de Cloudflare para crear ese registro automáticamente.
- Let’s Encrypt verifica el registro y emite el certificado.
- Proxmox instala el certificado y lo renueva automáticamente antes de que expire.
Requisitos
- Un servidor Proxmox VE (probado en 9.x).
- Un dominio gestionado por Cloudflare (puede ser el dominio raíz o un subdominio dedicado al homelab).
- Una cuenta en Cloudflare con acceso a la API.
- Acceso como
roota la consola web de Proxmox.
No es necesario que Proxmox sea accesible desde internet. El DNS Challenge funciona de forma completamente interna.
Hands-On
1. Crear el API Token de Cloudflare
Lo primero es generar un token de API en Cloudflare con los permisos mínimos necesarios para que Proxmox pueda modificar registros DNS.
Ir a Cloudflare Dashboard → Profile → API Tokens → Create Token.
Seleccionar Create Custom Token y configurarlo así:
- Token name:
proxmox-acme(o el nombre que prefieras) - Permissions:
Zone→DNS→Edit
- Zone Resources:
Include→Specific zone→ seleccionar tu dominio
- Seleccionar Continue to summary → Create Token
Una vez creado, copiar el token porque solo se mostrará una vez.
Guarda el token en un lugar seguro. Si lo pierdes tendrás que generar uno nuevo.
2. Configurar la cuenta ACME en Proxmox
Proxmox necesita registrar una cuenta con Let’s Encrypt antes de poder solicitar certificados. Esto se hace desde la interfaz web.
Ir a Datacenter → ACME y crear una nueva cuenta:
- Account Name:
cloudflare - Email: tu dirección de correo
- ACME Directory:
Let's Encrypt V2
Deberíamos ver un mensaje indicando el correcto registro de la cuenta.
3. Agregar el plugin de Cloudflare
Desde la misma pantalla Datacenter → ACME, ir a la pestaña Challenge Plugins y hacer clic en Add.
Configurar de la siguiente forma:
- Plugin ID:
cloudflare - DNS API:
Cloudflare Managed DNS - API Data:
1
CF_Token=<tu-token-de-cloudflare>
Hacer clic en Add para guardar. Deberiamos ver algo similar a esto si se configuró correctamente.
Proxmox almacena este token de forma segura en
/etc/pve/priv/acme/. No es necesario tocar ese archivo directamente.
4. Configurar el certificado en el nodo
Ahora vamos al nodo de Proxmox. Ir a Datacenter → [Nombre del nodo] → Certificates.
En la sección ACME, hacer clic en Add para agregar un dominio:
- Challenge Type:
DNS - Plugin:
cloudflare - Domain: el nombre DNS de tu Proxmox, por ejemplo
prox.home.cervant.net
El dominio que ingreses aquí debe existir (o poder existir) como registro DNS en Cloudflare. No tiene que ser público, pero sí tiene que estar en una zona gestionada por Cloudflare.
También asegurarse de que en Using Account esté seleccionada la cuenta que creamos en el paso anterior (cloudflare).
Seleccionar la cuenta y darle a Apply.
5. Solicitar el certificado
Con todo configurado, hacer clic en Order Certificates Now.
Proxmox iniciará el proceso ACME. En el log verás algo similar a esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Loading ACME account details
Placing ACME order
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/xxx'
The validation for prox.home.cervant.net is pending!
Add TXT record: _acme-challenge.prox.home.cervant.net
Sleeping 30 seconds to wait for TXT record propagation
Triggering validation
Sleeping for 5 seconds
Status is 'valid', domain 'prox.home.cervant.net' OK!
Remove TXT record: _acme-challenge.prox.home.cervant.net
All domains validated!
Creating CSR
Checking order status
Order is ready, finalizing order
valid!
Downloading certificate
Setting pveproxy certificate and key
Restarting pveproxy
TASK OK
Si todo salió bien, al recargar la interfaz web el candado del navegador debería estar en verde con un certificado válido. También se podrá ver el certificado creado en Datacenter → [Nombre del nodo] → Certificates.
Con esto ya tendríamos un certificado SSL válido en nuestro nodo de Proxmox que se renovará automáticamente, siempre que nuestro token de Cloudflare siga siendo válido.
Troubleshooting
Error: DNS challenge failed Verificar que el API Token tiene permisos de DNS Edit sobre la zona correcta. También revisar que el dominio ingresado en Proxmox pertenece a esa zona en Cloudflare.
Error: too many certificates already issued Alcanzaste el límite de Let’s Encrypt en producción (5 certificados por dominio por semana). Esperar o usar el entorno de staging para pruebas.
El certificado se emitió pero el navegador sigue mostrando advertencia Probablemente el nombre DNS del certificado no coincide con la URL que estás usando para acceder a Proxmox. Verifica que el dominio configurado en ACME coincide exactamente con el que escribes en el navegador.
Referencias
- Proxmox ACME Documentation
- Let’s Encrypt - How it works
- Cloudflare API Tokens
- acme.sh Cloudflare DNS API
Construye, automatiza, repite. ¡Nos vemos en el próximo post!














