
🌐 También en: English · Deutsch · Français
☝️ Una nota rápida para quien solo quería leer un artículo: TLS es la razón por la que tu navegador muestra ese pequeño candado. Cada vez que abres una página aquí, te llega cifrada. Nadie en el mismo wifi de la cafetería, en tu proveedor de internet ni en ningún punto intermedio puede leerla ni cambiar en secreto unas cuantas palabras. Y no, ya no se llama «SSL», aunque la web de pruebas de más abajo se empeñe en el nombre antiguo. SSL se jubiló en 2015; lo que nunca conseguimos jubilar fue la palabra. Así que cuando más abajo presumo de mis «ajustes de TLS», en realidad presumo de lo bien cerrado que está el sobre que envuelve esta misma frase. De nada. 🤓
De vez en cuando paso mi propio blog por Qualys SSL Labs, sobre todo para asegurarme de que nada se ha ido pudriendo en silencio desde la última vez. El resultado de esta noche me ha sacado una sonrisa: A+ en ambos endpoints, IPv4 e IPv6. Sin avisos, sin «peros», sin asteriscos.

Una nota está bien, pero una nota por sí sola no dice nada. Así que aquí va, en palabras sencillas, el idioma que habla de verdad este servidor. El mismo reparto de siempre: yo hago las preguntas y tomo las decisiones, y mi coadministrador de IA (Claude) sacó los datos brutos del análisis desde la API de SSL Labs y los cotejó con la configuración.
🔐 Lo que admite el blog (la versión corta)
| Característica | Lo que hacemos | Por qué importa |
|---|---|---|
| Protocolos | Solo TLS 1.3 y TLS 1.2 | TLS 1.0/1.1 y todas las versiones de SSL han desaparecido, y con ellas todo su museo de ataques. |
| Suites de cifrado | 6 en total, todas AEAD: AES-GCM y ChaCha20-Poly1305 | Nada de CBC, así que la familia de ataques de padding oracle (POODLE, Lucky13, GOLDENDOODLE, Zombie POODLE…) no tiene dónde hincar el diente. |
| Secreto perfecto hacia adelante | ECDHE en cada conexión | Una clave robada mañana no puede descifrar el tráfico grabado hoy. Los tickets de sesión están desactivados, para que eso siga siendo cierto al reanudar sesiones. |
| Intercambio de claves poscuántico | X25519MLKEM768 híbrido, ofrecido en primer lugar | Las versiones actuales de Chrome y Firefox ya lo usan. «Grabar ahora, descifrar después» pierde mucho atractivo. |
| Certificado | ECDSA P-256 de Let’s Encrypt, clave nueva en cada renovación | Más pequeño y rápido que RSA, y una clave antigua nunca sobrevive a su certificado. |
| HSTS | 1 año, includeSubDomains, preload – también en la redirección del dominio raíz | Tras la primera visita, el navegador se niega a usar HTTP sin cifrar con este dominio. Esto es lo que convierte la A en A+. |
| Extras | HTTP/2 vía ALPN, TLS_FALLBACK_SCSV, sin 0-RTT | Rápido, resistente a degradaciones y sin datos tempranos que se puedan reenviar. |
Todas las pruebas de vulnerabilidades del informe salen negativas: Heartbleed, ROBOT, Ticketbleed, FREAK, Logjam, la lista entera. No gracias a parches ingeniosos, sino porque las piezas vulnerables sencillamente ya no se ofrecen.
🤓 Tres detalles que me parecieron más interesantes que la nota
- La parte poscuántica vino gratis. Nunca configuré
X25519MLKEM768. El controlador de ingress trae un nginx compilado con OpenSSL 3.5, que pone el grupo híbrido en primer lugar por defecto. A veces la mejor función de seguridad es simplemente tener las imágenes al día. - Sin grapado OCSP, a propósito. SSL Labs lo marca como «No», y parece un hueco. No lo es: Let’s Encrypt ha retirado OCSP y los certificados actuales ya no llevan ninguna URL de OCSP. No hay nada que grapar; la revocación funciona ahora con CRL y vigencias cortas.
- El precio de ser estricto. 46 de los 68 clientes simulados se conectan sin problemas. Los 22 que fallan son fósiles: Internet Explorer hasta la versión 10, Android hasta 4.3, Safari hasta 8, Java 6/7, OpenSSL 0.9.8, Chrome 49 en Windows XP y un rastreador de Baidu de 2015. Puedo vivir con ello.
🛠️ Dónde vive el A+: mi código de Ansible
Nada de esto se configuró a golpe de clic en el servidor. Todo el stack se despliega desde mi repositorio público de Ansible aptupgrademe/www_k3s, y el análisis de arriba se hizo sobre el servidor tal cual lo deja una ejecución del playbook, sin retoques manuales. Así que puedes ver este artículo como un informe de pruebas del código. Si quieres copiar los ajustes, estos son los dos archivos que debes leer:
roles/common_k3s/templates/ingress-nginx-values.yml.j2– protocolos, lista de cifrados, caché de sesión, tickets desactivados y el comentario que explica por qué falta a propósito el grapado OCSP.roles/blog_k3s_deploy/templates/ingress.yml.j2– la solicitud del certificado ECDSA para cert-manager, la cabecera HSTS y la redirección del dominio raíz preparada para preload.
Lo esencial cabe en una pantalla:
# ingress controller (shared role, also in front of my Nextclouds)
ssl-protocols: "TLSv1.2 TLSv1.3"
ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305"
ssl-prefer-server-ciphers: "false"
ssl_session_tickets off;
# blog ingress: ECDSA certificate with a fresh key on every renewal
cert-manager.io/private-key-algorithm: "ECDSA"
cert-manager.io/private-key-size: "256"
cert-manager.io/private-key-rotation-policy: "Always"
# HSTS, even on the redirects
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;Como la parte de TLS está en un rol compartido, los mismos ajustes protegen también mis dos instancias de Nextcloud. Un arreglo, tres servidores.
📝 Todavía en la lista
- Inclusión en la lista de precarga HSTS: la cabecera está lista para preload, pero el dominio aún no figura en las listas de los navegadores. Es un camino sin vuelta atrás, así que me lo tomo con calma.
- Registro CAA: una entrada DNS que dice «solo Let’s Encrypt puede emitir certificados para este dominio». Pequeño, barato, aún pendiente.
¿Quieres comprobarlo tú mismo? El informe de SSL Labs en directo está a un clic. Y si tu propio servidor saca una B, la lista de cifrados de arriba es un buen punto de partida.





