Ya tienes las cuatro primitivas: cifrado simétrico, cifrado asimétrico, hash con MAC, y firma digital. La lección anterior cerró anunciando algo incómodo, y esta lo desarrolla: combinar primitivas correctas no garantiza un sistema seguro. El ensamblaje —el orden de los mensajes, qué se autentica, qué se negocia, qué pasa cuando algo falla— tiene sus propios modos de fallo, y la historia de la criptografía aplicada está llena de protocolos hechos con AES impecable y RSA impecable que se rompieron por cómo estaban montados. Esta lección estudia el TLS que llevas ocho lecciones dando por supuesto —cumpliendo la promesa del módulo 2—, con su handshake paso a paso, cómo verificarlo y cómo configurarlo; y añade SSH, VPN, mTLS, el correo cifrado y los ataques clásicos contra protocolos: downgrade, stripping, MITM y repetición.
Contenido
- Qué es un protocolo criptográfico y por qué puede fallar
- TLS: qué protege y qué no
- De SSL a TLS 1.3: qué mejora cada versión
- El handshake de TLS 1.3 paso a paso
- Suites de cifrado: cómo se leen
- Verificar TLS desde la línea de órdenes
- Configuración segura del servidor de Nimbus
- mTLS: TLS mutuo y cuándo tiene sentido
- Otros protocolos: SSH, VPN, correo y cifrado extremo a extremo
- Ataques contra protocolos y sus defensas
- Errores de implementación con impacto real
- Qué es un protocolo criptográfico y por qué puede fallar
Un protocolo criptográfico es una secuencia acordada de mensajes entre dos o más partes que, usando primitivas criptográficas, consigue un objetivo de seguridad concreto: establecer un canal confidencial, autenticar a alguien, acordar una clave, probar una posesión.
La diferencia con una primitiva es la misma que hay entre un ladrillo y un edificio. Un ladrillo se ensaya en laboratorio y aguanta; un edificio se cae por el diseño, no por el ladrillo. Los modos de fallo típicos de un protocolo son estos, y ninguno implica romper el álgebra:
| Modo de fallo | En qué consiste | Ejemplo |
|---|---|---|
| No autenticar el intercambio | Se acuerda una clave, pero con quien no toca | Diffie-Hellman sin certificado → MITM (03-03) |
| Negociación manipulable | El atacante fuerza la opción más débil | Ataques de downgrade (apartado 10) |
| Falta de frescura | Un mensaje válido antiguo se reenvía | Repetición del webhook sin marca de tiempo (03-04) |
| Fugar información en los errores | La respuesta distingue tipos de fallo | Oráculo de relleno (03-02) |
| Confundir el orden de operaciones | Autenticar y cifrar mal combinados | MAC-then-encrypt frente a AEAD |
| Estados no previstos | Mensajes fuera de secuencia o repetidos | Fallos de máquina de estados en implementaciones de TLS |
De ahí la regla del apartado, coherente con todo el módulo: los protocolos tampoco se diseñan ni se implementan a mano. Se usan protocolos estándar, con implementaciones maduras, actualizadas y bien configuradas. Tu trabajo profesional es elegir la versión correcta, configurarla bien y verificar que efectivamente hace lo que crees.
- TLS: qué protege y qué no
TLS (Transport Layer Security) es el protocolo que convierte HTTP en HTTPS, y también protege SMTP, IMAP, conexiones a bases de datos y prácticamente cualquier cosa que viaje por una red hoy. Es el ejemplo perfecto de cifrado híbrido (03-03) llevado a producción.
| TLS sí protege | TLS no protege |
|---|---|
| Confidencialidad del contenido en tránsito | Los datos una vez llegan al servidor |
| Integridad: detecta modificación en el camino | Frente a un servidor comprometido o malicioso |
| Autenticidad del servidor mediante su certificado | El nombre de dominio al que te conectas (viaja visible en el DNS y, salvo con ECH, en el SNI) |
| Forward secrecy con ECDHE | Metadatos: quién habla con quién, cuándo y cuánto |
| Confidencialidad frente a la red intermedia | Frente a un cliente comprometido (móvil con malware) |
Dos consecuencias prácticas que conviene decir en voz alta:
- «Va por HTTPS» no significa «es seguro». El IDOR de 01-01, la inyección SQL de 02-02 y la fuga del bucket de 02-06 ocurrirían igual sobre TLS impecable. TLS protege el tramo, no la aplicación.
- El candado del navegador no acredita honestidad. Acredita que hablas con el dominio que pone en la barra. Una web de phishing con dominio
nimbus-reservas-clientes.exampletendrá su candado perfecto (02-03).
- De SSL a TLS 1.3: qué mejora cada versión
| Versión | Año | Estado en 2026 | Nota |
|---|---|---|---|
| SSL 2.0 / 3.0 | 1995/1996 | Prohibidos | Rotos (POODLE y otros) |
| TLS 1.0 | 1999 | Obsoleto | Retirado por los navegadores y por PCI DSS |
| TLS 1.1 | 2006 | Obsoleto | Retirado junto con 1.0 |
| TLS 1.2 | 2008 | Aceptable si se restringen las suites | Todavía necesario para clientes antiguos |
| TLS 1.3 | 2018 | Recomendado | Lo que debe usar Nimbus por defecto |
Qué mejora TLS 1.3, que es lo que hay que saber explicar:
- Menos vueltas. El handshake se completa en 1-RTT (un ida y vuelta) frente a las dos de TLS 1.2. Se nota en latencia, especialmente desde móvil.
- Suites reducidas y sin piezas rotas. Se eliminaron del estándar RC4, 3DES, MD5, SHA-1, la compresión, la renegociación y los modos CBC con MAC-then-encrypt. Solo quedan suites AEAD (03-02).
- Forward secrecy obligatoria. Desaparece el intercambio de clave por RSA estático: todo es ECDHE (03-03). Ya no puedes configurarlo mal, porque la opción mala no existe.
- Más del handshake va cifrado, incluido el certificado del servidor, lo que reduce lo que un observador aprende.
- Menos margen para errores de configuración. Es la mejora más subestimada: TLS 1.3 es seguro por defecto, mientras que TLS 1.2 exige que el administrador acierte con la lista de suites.
Hay un matiz que conviene conocer: TLS 1.3 permite reanudación en 0-RTT, que envía datos en el primer mensaje. Es rápido, pero esos datos son susceptibles de repetición, así que solo debe usarse para peticiones idempotentes. Para la API de Nimbus, la recomendación es no habilitar 0-RTT.
- El handshake de TLS 1.3 paso a paso
sequenceDiagram
participant C as Cliente (app movil)
participant S as Servidor (API Nimbus)
C->>S: ClientHello<br/>versiones, suites AEAD,<br/>clave publica efimera (ECDHE),<br/>SNI = api.nimbusreservas.example
S->>S: Genera su par efimero<br/>y calcula el secreto compartido
S->>C: ServerHello<br/>suite elegida + clave publica efimera
Note over C,S: A partir de aqui TODO va cifrado
S->>C: {Certificado + cadena}<br/>{CertificateVerify: firma con la clave privada}<br/>{Finished}
C->>C: Valida la cadena, el nombre,<br/>la vigencia y la firma
C->>S: {Finished}
Note over C,S: Canal establecido: AES-GCM o ChaCha20-Poly1305
Los cinco momentos, con lo que aporta cada uno:
- ClientHello. El cliente propone versiones y suites, y —clave para el 1-RTT— ya envía su clave pública efímera, adelantando el intercambio ECDHE. Incluye el SNI, el nombre del servidor al que quiere conectarse, necesario porque una misma IP aloja muchos dominios.
- ServerHello. El servidor elige la suite y envía su clave pública efímera. Con las dos mitades, ambos calculan el mismo secreto compartido (03-03) y derivan de él las claves de sesión mediante HKDF (03-02). Aquí entra ECDHE y aquí nace la forward secrecy.
- A partir de este punto todo va cifrado, incluido el certificado.
- Certificado y CertificateVerify. El servidor envía su certificado y su cadena, y firma con su clave privada un resumen de todo el handshake. Esto es lo que autentica el intercambio y cierra la puerta al MITM de 03-03: el atacante puede hacer su propio ECDHE, pero no puede producir esa firma sin la clave privada correspondiente al certificado. El cliente valida la cadena hasta una raíz de confianza, el nombre del dominio, la vigencia y la firma —lo que se emite y cómo se valida es materia de 03-06—.
- Finished en ambos sentidos. Cada extremo demuestra que ha visto exactamente los mismos mensajes. Esto es lo que detecta un downgrade: si un atacante hubiera alterado el
ClientHellopara forzar una suite débil, el resumen no cuadraría.
A partir de ahí, el tráfico se cifra con AES-GCM o ChaCha20-Poly1305 y claves simétricas. Es exactamente el patrón híbrido de 03-03: lo asimétrico solo para acordar y autenticar, lo simétrico para los datos.
- Suites de cifrado: cómo se leen
Una suite de cifrado es la combinación concreta de algoritmos que se usa en una sesión. En TLS 1.2 el nombre incluye cuatro piezas:
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
| | | |
| | | +-- funcion hash para derivacion y MAC
| | +-- cifrado de los datos: AES-256 en modo GCM (AEAD)
| +-- autenticacion del servidor: firma RSA (del certificado)
+-- intercambio de claves: ECDHE (efimero -> forward secrecy)En TLS 1.3 los nombres son mucho más cortos, porque el intercambio y la autenticación ya no se negocian en la suite:
Cómo evaluar una suite de un vistazo: si el intercambio no empieza por ECDHE (o DHE), no hay forward secrecy; si el cifrado es CBC, RC4 o 3DES, está fuera; si el hash es MD5 o SHA (por SHA-1), está fuera. Las tres suites de TLS 1.3 son todas correctas, que es precisamente la ventaja de esa versión.
- Verificar TLS desde la línea de órdenes
Saber leer el estado real de un servidor es una habilidad operativa básica. Lucía comprueba la API de Nimbus:
# Conexion completa: muestra certificado, cadena, version y suite
openssl s_client -connect api.nimbusreservas.example:443 \
-servername api.nimbusreservas.example </dev/null 2>/dev/null | head -40
# Comprobar si el servidor ACEPTA una version obsoleta (debe FALLAR)
openssl s_client -connect api.nimbusreservas.example:443 -tls1_1 </dev/null
# Ver solo fechas de validez del certificado
echo | openssl s_client -connect api.nimbusreservas.example:443 \
-servername api.nimbusreservas.example 2>/dev/null \
| openssl x509 -noout -dates -subject -issuerSalida comentada de la primera orden:
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R11
verify return:1
depth=0 CN = api.nimbusreservas.example
verify return:1
---
Certificate chain
0 s:CN = api.nimbusreservas.example
i:C = US, O = Let's Encrypt, CN = R11
1 s:C = US, O = Let's Encrypt, CN = R11
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
---
SSL handshake has read 4521 bytes and written 396 bytes
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Verify return code: 0 (ok)Cómo se lee esta salida, que es lo importante:
depth=2,depth=1,depth=0son los tres eslabones de la cadena: raíz, intermedia y certificado del servidor.verify return:1en cada uno significa que ese eslabón validó.Certificate chainmuestra, para cada certificado, su sujeto (s:) y su emisor (i:). Fíjate en el encadenamiento: el emisor de uno es el sujeto del siguiente. La jerarquía completa es materia de 03-06.New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384es la línea que resume el resultado: versión negociada y suite. Si aquí aparecieraTLSv1.0o una suite con CBC, habría hallazgo.Server public key is 256 bitindica una clave ECC de 256 bits (equivalente a RSA-3072, tabla de 03-03). Si dijera 2048, sería RSA.Verify return code: 0 (ok)es la validación completa. Cualquier otro valor —10caducado,18autofirmado,19raíz no fiable,21no se pudo verificar— es un problema.- Las opciones:
-servernameenvía el SNI, imprescindible cuando la IP aloja varios dominios; sin él puedes estar viendo un certificado que no es el tuyo.</dev/nullcierra la entrada para que la orden no se quede esperando.
Y la comprobación de HSTS, que se hace sobre las cabeceras HTTP:
- Configuración segura del servidor de Nimbus
Fragmento de configuración de Nginx para el frontal de Nimbus, explicado directiva a directiva:
server {
listen 443 ssl;
http2 on;
server_name api.nimbusreservas.example;
ssl_certificate /etc/letsencrypt/live/nimbus/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nimbus/privkey.pem;
# 1. Solo versiones vigentes
ssl_protocols TLSv1.2 TLSv1.3;
# 2. Suites permitidas en TLS 1.2 (en 1.3 las fija el propio protocolo)
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# 3. Curvas para el intercambio efimero
ssl_ecdh_curve X25519:prime256v1;
# 4. Reanudacion de sesion, sin 0-RTT
ssl_session_cache shared:TLS:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_early_data off;
# 5. Grapado OCSP
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 9.9.9.9 valid=300s;
# 6. HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
# 7. Redireccion permanente de HTTP a HTTPS
server {
listen 80;
server_name api.nimbusreservas.example;
return 301 https://$host$request_uri;
}Qué hace cada bloque:
ssl_protocols TLSv1.2 TLSv1.3. Deshabilita SSL y TLS 1.0/1.1. Si toda tu base de clientes es moderna, dejar soloTLSv1.3es mejor todavía; mídelo antes con los registros de acceso.ssl_ciphers. Solo suites ECDHE (forward secrecy) con AEAD.ssl_prefer_server_ciphers offes lo recomendado hoy: se deja elegir al cliente dentro de la lista permitida, porque un móvil sin aceleración AES elegirá ChaCha20 y irá más rápido con la misma seguridad.ssl_ecdh_curve X25519:prime256v1. Prioriza X25519 (03-03), más rápida y más difícil de implementar mal.- Reanudación. La caché acelera reconexiones.
ssl_session_tickets offevita el riesgo de que una clave de tickets mal rotada anule la forward secrecy;ssl_early_data offdesactiva 0-RTT por el riesgo de repetición. - Grapado OCSP. El servidor adjunta al handshake una prueba reciente de que su certificado no está revocado, en lugar de obligar al cliente a consultarla. Mejora privacidad y latencia; el mecanismo de revocación se estudia en 03-06.
- HSTS.
max-age=63072000(dos años) indica al navegador que solo use HTTPS para este dominio;includeSubDomainslo extiende a todos los subdominios ypreloadpermite incluirlo en la lista precargada de los navegadores. Es la defensa contra el stripping del apartado 10. Cuidado:includeSubDomainsypreloadson difíciles de revertir; verifica antes que todos los subdominios sirven HTTPS. - Redirección 301 de HTTP a HTTPS. Necesaria, pero no suficiente: la primera petición sigue viajando en claro. Por eso hace falta HSTS.
Verifica siempre el resultado con un analizador externo de configuración TLS y con las órdenes del apartado 6: la configuración escrita y la efectiva no siempre coinciden, sobre todo con balanceadores o CDN por delante.
- mTLS: TLS mutuo y cuándo tiene sentido
En TLS normal solo se autentica el servidor; el cliente se identifica después, dentro del canal, con una contraseña o un token. En mTLS (mutual TLS), ambos extremos presentan certificado y ambos se autentican durante el propio handshake.
| Escenario en Nimbus | ¿mTLS? | Motivo |
|---|---|---|
| App móvil y SPA de clientes finales | No | Miles de dispositivos: distribuir y rotar certificados es inviable. Usa OIDC y tokens (02-05) |
| Comunicación con la pasarela de pago | Sí, si el proveedor lo ofrece | Pocos extremos, alto valor, requisito habitual del sector |
| Entre servicios internos (API ↔ trabajadores en segundo plano) | Sí, recomendable | Materializa el Zero Trust de 01-03: cada servicio prueba su identidad en cada conexión |
| Acceso de la consultora (A-19) | Conviene, junto con MFA y acceso just-in-time | Refuerza el control del tercero que originó el incidente de 02-06 |
Lo que aporta: la autenticación ocurre antes de que la aplicación procese nada, así que un atacante sin certificado válido ni siquiera llega a la lógica de negocio. Lo que cuesta: hay que emitir, distribuir, renovar y revocar un certificado por cliente, lo que exige una PKI interna —el asunto de 03-06—. La regla práctica: mTLS entre pocos sistemas de alto valor, tokens para muchos usuarios.
- Otros protocolos: SSH, VPN, correo y cifrado extremo a extremo
| Protocolo | Qué garantiza | Uso en Nimbus |
|---|---|---|
| SSH | Canal cifrado y autenticado para administración remota | Acceso de Lucía a los servidores |
| IPsec | Cifrado a nivel de red, estándar y maduro, configuración compleja | VPN de sitio a sitio |
| WireGuard | Cifrado moderno, código pequeño, muy rápido, sin opciones que elegir mal | VPN de acceso remoto |
| S/MIME | Firma y cifrado de correo con certificados de una CA | Correo corporativo con requisitos formales |
| PGP/GPG | Firma y cifrado de correo y ficheros, con red de confianza | Intercambios puntuales; usable pero incómodo |
| Signal Protocol | Cifrado extremo a extremo con forward secrecy por mensaje | Mensajería; concepto de referencia para E2EE |
| RFC 3161 (sellado de tiempo) | Prueba de que un dato existía en una fecha | Sellar registros de auditoría |
SSH merece un detalle, porque su modelo de confianza es distinto del de TLS: no hay autoridades de certificación, sino una huella del host que el cliente memoriza la primera vez (trust on first use).
# Generar una clave Ed25519 para Lucia (03-03)
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_nimbus
# Ver la huella de la clave publica
ssh-keygen -lf ~/.ssh/id_ed25519_nimbus.pub
# Obtener la huella del servidor ANTES de conectarse por primera vez,
# por un canal distinto (panel del proveedor, documentacion interna)
ssh-keyscan -t ed25519 bastion.nimbusreservas.example | ssh-keygen -lf -256 SHA256:aQ2vR7xK0mN3pLdT9wYcF1uZgB8sEjH5rXo4VnQiM2k [email protected] (ED25519)
256 SHA256:7fJkP0sWqL9mR2xN4dV6yTgB1cZuH8eA3oXiK5vQnE0 bastion.nimbusreservas.example (ED25519)Lo esencial: cuando SSH avisa de que la clave del host ha cambiado o es desconocida, aceptar a ciegas equivale a aceptar un posible MITM. La huella debe compararse con la obtenida por otro canal. Y para un parque como el de Nimbus, la solución que escala es firmar las claves de host con una CA de SSH, lo que sustituye la memorización por una confianza jerárquica (03-06). Además: autenticación solo por clave —PasswordAuthentication no—, clave protegida con frase de paso y root sin acceso directo; el endurecimiento completo del servidor es de 05-06.
Sobre las VPN, aquí solo interesa qué garantizan: un túnel cifrado y autenticado entre dos puntos. No dan control de acceso a las aplicaciones ni convierten en confiable lo que hay dentro. El despliegue de red se trata en 05-04.
Y el cifrado extremo a extremo como concepto: los datos se cifran en el dispositivo del emisor y solo se descifran en el del destinatario, de modo que ni el proveedor del servicio puede leerlos. Es la diferencia con TLS, donde el servidor sí ve el contenido. Para Nimbus, un E2EE completo sería incompatible con su función —la aplicación necesita procesar las citas—, pero el concepto reaparece en 03-07 al hablar del cifrado a nivel de campo.
- Ataques contra protocolos y sus defensas
| Ataque | Cómo funciona | Defensa |
|---|---|---|
| Downgrade | Se manipula la negociación para forzar una versión o suite débil | Deshabilitar versiones antiguas; el Finished de TLS 1.3 detecta la manipulación |
| SSL stripping | El atacante intercepta la petición HTTP inicial y sirve todo por HTTP, sin que el usuario lo note | HSTS (mejor con preload), redirección 301, cookies con Secure |
| MITM con certificado falso | El atacante presenta un certificado propio; solo funciona si el cliente no valida o si una CA lo emitió indebidamente | Validación estricta, pinning, transparencia de certificados (03-06) |
| Repetición | Se reenvía un mensaje legítimo capturado | Nonces, marcas de tiempo, ventanas, contadores, idempotencia |
| Oráculo de relleno | Se descifra observando cómo responde el servidor a rellenos inválidos | AEAD; TLS 1.3 lo elimina por diseño |
| Compresión (CRIME/BREACH) | El tamaño comprimido filtra información del secreto | Sin compresión TLS; cuidado con la compresión a nivel de aplicación |
Dos merecen desarrollo:
El stripping es el ataque más rentable contra un usuario en una wifi pública, y no rompe TLS: lo esquiva. La víctima escribe nimbusreservas.example sin https://, el navegador prueba HTTP, y el atacante intercepta esa petición inicial y actúa de proxy en claro hacia el usuario mientras habla en HTTPS con el servidor real. HSTS lo corta porque el navegador, tras la primera visita legítima, se niega a usar HTTP para ese dominio. Y preload cierra también esa primera visita, al venir la regla de fábrica en el navegador.
El pinning consiste en que el cliente exija no solo un certificado válido, sino uno concreto (o una CA concreta). Sirve contra el escenario de una CA que emite un certificado indebido para tu dominio. Tiene un riesgo serio: si se rota el certificado sin actualizar el pin, la aplicación deja de funcionar y solo se arregla publicando una nueva versión. Recomendación para Nimbus: valorarlo en la app móvil —donde el ciclo de actualización es controlable y el pin puede apuntar a la CA, no a la hoja—, y no en el navegador. Para el resto, la transparencia de certificados (03-06) cubre el mismo riesgo con mucho menos coste operativo.
- Errores de implementación con impacto real
El protocolo puede ser impecable y la implementación anularlo. El ejemplo canónico, ya citado en 02-02:
# =============== INCORRECTO — NO USAR NUNCA ===============
import requests
# "No me funcionaba por un error de certificado y asi ya va"
r = requests.get("https://api.pasarela-pago.example/v1/cobros",
verify=False) # <-- DESACTIVA TODA LA VALIDACION
# ==========================================================Qué significa exactamente esa línea: la conexión sigue cifrada, pero se acepta cualquier certificado, incluido el de un atacante. Es decir, se conserva el coste de TLS y se pierde por completo su garantía, porque sin autenticar al otro extremo el cifrado protege una conversación con quien sea. Es el MITM de 03-03 servido en bandeja, y en este caso concreto expondría el tráfico con la pasarela de pago.
La versión correcta, con las tres situaciones que suelen provocar el atajo:
import requests
# 1. CASO NORMAL: la validacion esta activada por defecto. No toques nada.
r = requests.get("https://api.pasarela-pago.example/v1/cobros",
timeout=10)
# 2. CA INTERNA (servicios internos de Nimbus con PKI propia, 03-06):
# se indica el certificado raiz de confianza, NO se desactiva la validacion.
r = requests.get("https://interno.nimbus.local/metricas",
verify="/etc/nimbus/ca-interna.pem", timeout=10)
# 3. mTLS (apartado 8): certificado de cliente ademas de validar el servidor.
r = requests.get("https://api.pasarela-pago.example/v1/cobros",
cert=("/etc/nimbus/cliente.pem", "/etc/nimbus/cliente.key"),
timeout=10)Otros errores del mismo grupo, todos habituales y todos igual de graves:
| Error | Consecuencia |
|---|---|
| Validar la firma del certificado pero no el nombre del dominio | Cualquier certificado válido de cualquier dominio sirve |
| No comprobar la caducidad o ignorar la revocación | Se acepta un certificado retirado |
| Capturar la excepción de validación y reintentar sin validar | El fallo se convierte en una vulnerabilidad silenciosa |
| Confiar en una CA añadida al almacén del sistema para depurar y olvidarla | Puerta trasera permanente |
Poner el verify=False solo en desarrollo… y que el código llegue a producción |
Ocurre constantemente |
La defensa organizativa es la de siempre: una comprobación en el CI (02-04) que rechace verify=False, InsecureSkipVerify, rejectUnauthorized: false y curl -k, y revisión obligatoria entre dos personas para cualquier excepción justificada, con fecha de caducidad y ticket asociado.
Errores Comunes y Consejos
Conceptuales
- Creer que HTTPS hace segura la aplicación. Protege el tramo, no la lógica.
- Tomar el candado por una acreditación de honestidad. Acredita el dominio, nada más.
- Pensar que una VPN sustituye al control de acceso. Da un túnel; dentro del túnel sigue haciendo falta autorizar.
- Suponer que el certificado se renueva solo porque «lo pusimos con Let's Encrypt». La renovación automática también se rompe, y hay que monitorizarla (03-06).
De configuración
- Dejar habilitados TLS 1.0/1.1 o suites con CBC, RC4 o 3DES.
- Redirigir a HTTPS sin HSTS. La primera petición sigue viajando en claro.
- Activar
includeSubDomainsypreloadsin comprobar todos los subdominios. Difícil de revertir; puede dejar servicios inaccesibles. - Habilitar 0-RTT sin analizar la repetición.
- No verificar la configuración efectiva cuando hay CDN o balanceador delante: lo que sirve el frontal puede no ser lo que configuraste.
De implementación
verify=Falsey equivalentes. El error canónico.- Validar la cadena pero no el nombre del host.
- Aceptar a ciegas una huella SSH nueva o cambiada.
- Fijar un pin de certificado sin plan de rotación. Convierte una renovación rutinaria en una caída.
Consejos
- Configura TLS 1.3 por defecto, deja 1.2 solo con suites ECDHE-AEAD si tienes clientes antiguos, y revisa esa decisión con datos de tus registros cada seis meses.
- Monitoriza la fecha de caducidad de cada certificado con alerta a 30 y a 7 días. Un certificado caducado es una incidencia de disponibilidad, y en Equifax (02-06) cegó además la detección.
- Automatiza la verificación: una comprobación programada que ejecute
openssl s_clientcontra tus dominios y alerte si cambian la versión, la suite o la huella del certificado. - Recuerda la jerarquía de responsabilidad: el protocolo lo eligen los estándares, la versión y la configuración las eliges tú, y la validación la respeta tu código. Los tres tienen que estar bien.
Ejercicios
Ejercicio 1 — Leer un diagnóstico de TLS
Lucía ejecuta openssl s_client contra un servicio interno y obtiene:
depth=0 CN = interno.nimbus.local
verify error:num=18:self signed certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
Verify return code: 18 (self signed certificate)Se pide: (a) enumera todos los problemas que revela esta salida y ordénalos por gravedad; (b) explica qué garantía concreta se pierde con cada uno; (c) indica si el certificado autofirmado es siempre un fallo o puede ser aceptable, y bajo qué condiciones; (d) propón la configuración objetivo para este servicio interno.
Ejercicio 2 — Diseñar la protección del canal con la pasarela
Nimbus integra una nueva pasarela de pago. El proveedor ofrece: TLS 1.2 o 1.3, mTLS opcional, firma HMAC de los webhooks y una lista blanca de IP.
Se pide: (a) decide qué mecanismos activar y en qué dirección actúa cada uno (Nimbus→pasarela, pasarela→Nimbus); (b) explica qué amenaza concreta detiene cada mecanismo y cuáles se solapan; (c) indica qué pasa si la clave privada del certificado de cliente de Nimbus se filtra, y qué debe ocurrir entonces; (d) razona si la lista blanca de IP es un control criptográfico y qué valor real aporta.
Ejercicio 3 — Explicar HSTS y el stripping
Rubén pregunta por qué, si la web de Nimbus «redirige sola a HTTPS», hace falta configurar nada más.
Se pide: (a) describe paso a paso un ataque de stripping contra un cliente de Nimbus en la wifi de una cafetería; (b) explica por qué la redirección 301 no lo impide; (c) explica qué hace HSTS y qué añade preload; (d) indica los dos riesgos operativos de includeSubDomains y preload y cómo se mitigan antes de activarlos.
Soluciones
Ejercicio 1
(a) y (b) Problemas por gravedad:
| Gravedad | Problema | Garantía que se pierde |
|---|---|---|
| Alta | Certificado autofirmado (code 18): no lo respalda ninguna CA de confianza |
Autenticación del servidor. Sin ella, el canal está cifrado con quien sea: MITM posible |
| Media | Suite AES256-SHA384 sin GCM: es CBC con MAC-then-encrypt |
Integridad robusta y resistencia a oráculos de relleno. No es AEAD |
| Media | TLS 1.2 en lugar de 1.3 | Handshake con más superficie, negociación configurable, más margen de error |
| Baja | Clave RSA de 2048 bits | Nada urgente (~112 bits), pero por debajo de la recomendación de 128; migrar a ECC P-256 o RSA-3072 |
(c) ¿Es siempre un fallo? No necesariamente. Para un servicio interno, lo inaceptable no es que el certificado no lo firme una CA pública, sino que no lo firme nada en lo que el cliente confíe explícitamente. Es aceptable si existe una CA interna cuyo certificado raíz está instalado en los clientes y estos lo validan de verdad (verify="/ruta/ca-interna.pem", apartado 11). Lo que nunca es aceptable es la combinación habitual: certificado autofirmado más verify=False en los clientes, que es cifrado sin autenticación.
(d) Configuración objetivo: certificado emitido por la CA interna de Nimbus (03-06), con SAN correcto para interno.nimbus.local; solo TLS 1.3, al ser todos los clientes propios; clave ECDSA P-256 o Ed25519; validación estricta en todos los clientes contra la raíz interna; y, dado que es comunicación entre servicios, mTLS (apartado 8), con renovación automatizada y alerta de caducidad.
Ejercicio 2
(a) y (b) Mecanismos:
| Mecanismo | Dirección | Amenaza que detiene |
|---|---|---|
| TLS 1.3 con validación estricta | Nimbus → pasarela | Interceptación y MITM del tráfico de cobros. Imprescindible |
| mTLS | Nimbus → pasarela | Que un tercero con credenciales robadas invoque la API de la pasarela en nombre de Nimbus. Añade autenticación antes de la aplicación |
| HMAC en el webhook | Pasarela → Nimbus | Notificaciones de pago falsificadas por quien descubra la URL (03-04). Imprescindible |
| Lista blanca de IP | Ambas | Reduce la superficie: solo se aceptan conexiones desde rangos conocidos |
Solapamientos. mTLS y lista blanca se solapan parcialmente en la dirección Nimbus→pasarela, pero actúan en capas distintas (identidad criptográfica frente a origen de red) y son complementarios en defensa en profundidad (01-03). TLS y HMAC no se solapan: TLS protege el canal, HMAC protege el mensaje, y sigue haciendo falta HMAC aunque el webhook llegue por HTTPS, porque HTTPS acredita el canal, no quién compuso el contenido.
(c) Si se filtra la clave privada del certificado de cliente: un atacante podría autenticarse ante la pasarela como Nimbus. Hay que revocar el certificado de inmediato, emitir uno nuevo con una clave nueva, desplegarlo, notificar al proveedor, revisar los registros de la pasarela en busca de operaciones no reconocidas y ejecutar el análisis de causa raíz (por qué la clave era accesible). El ciclo de vida completo, en 03-06.
(d) La lista blanca de IP no es un control criptográfico: no aporta confidencialidad, integridad ni autenticidad demostrable, y la dirección de origen es suplantable en algunos escenarios. Su valor real es reducir la superficie de ataque (01-04) y filtrar ruido automatizado. Es un control útil y barato, pero nunca puede sustituir a TLS ni al HMAC.
Ejercicio 3
(a) El ataque, paso a paso. (1) El cliente se conecta a la wifi de la cafetería, donde el atacante controla el punto de acceso o hace envenenamiento ARP. (2) Escribe nimbusreservas.example en el navegador, sin https://. (3) El navegador emite una petición HTTP en claro. (4) El atacante la intercepta y no la deja llegar; en su lugar establece él una conexión HTTPS legítima con Nimbus y sirve al usuario el mismo contenido por HTTP. (5) El usuario ve la web correcta, sin candado —pocos lo miran— e introduce sus credenciales. (6) El atacante las lee en claro y las reenvía a Nimbus, que ve una sesión perfectamente normal.
(b) Por qué la redirección 301 no basta. La redirección la envía el servidor, y en este ataque la petición inicial nunca llega al servidor: la intercepta el atacante, que simplemente no redirige. La redirección solo actúa cuando el tráfico llega a Nimbus; el ataque vive precisamente en el tramo anterior.
(c) Qué hace HSTS. La cabecera Strict-Transport-Security indica al navegador que, durante max-age segundos, debe usar HTTPS obligatoriamente para ese dominio, convirtiendo internamente cualquier http:// en https:// antes de enviar nada por la red. Tras una sola visita legítima, el stripping deja de funcionar. preload va más allá: el dominio se inscribe en una lista que los navegadores traen de fábrica, de modo que la regla se aplica incluso en la primera visita, cubriendo el único hueco que quedaba.
(d) Los dos riesgos operativos. (1) includeSubDomains obliga a HTTPS en todos los subdominios, presentes y futuros; si alguno —una web interna, un entorno de pruebas, un panel antiguo— solo sirve HTTP, dejará de ser accesible desde los navegadores que hayan visto la cabecera. (2) preload es muy difícil de revertir: la retirada de la lista tarda meses en propagarse con las versiones de los navegadores, así que un error se arrastra mucho tiempo. Mitigación: inventariar todos los subdominios y comprobar que sirven HTTPS válido; desplegar primero con un max-age corto (por ejemplo, 300 segundos) y sin preload; verificar durante unas semanas; y solo entonces subir a dos años y solicitar la inscripción.
Conclusión
Has dado el salto de las piezas al ensamblaje, y con él una idea que conviene no olvidar: combinar primitivas correctas no basta, porque un protocolo falla por no autenticar el intercambio, por una negociación manipulable, por falta de frescura, por fugar información en los errores o por estados no previstos —ninguno de esos fallos requiere romper el álgebra—. De ahí la extensión natural de la regla del módulo: los protocolos tampoco se diseñan a mano; se eligen, se configuran y se verifican.
Y has saldado la deuda pendiente desde el módulo 2. Sabes qué protege TLS —confidencialidad, integridad, autenticidad del servidor y forward secrecy en el tramo— y qué no: la aplicación, los metadatos, el servidor comprometido y el cliente infectado. Conoces la evolución hasta TLS 1.3 y sus cinco mejoras, con la más importante siendo la que menos se cita: que es seguro por defecto, porque las opciones malas ya no existen. Has recorrido el handshake paso a paso viendo exactamente dónde entra ECDHE —y con él la forward secrecy—, dónde entra el certificado con su CertificateVerify, que es lo que cierra la puerta al MITM, y dónde empieza el cifrado simétrico AEAD; sabes leer una suite y descartar en un vistazo las que no llevan ECDHE o llevan CBC. Lo has verificado en la práctica con openssl s_client interpretando depth, cadena, versión, suite y Verify return code, y con curl -I para HSTS; y has configurado el frontal de Nimbus directiva a directiva: versiones, suites, curvas, reanudación sin 0-RTT, grapado OCSP, HSTS y redirección. Añades mTLS para pocos sistemas de alto valor, la panorámica de SSH con su confianza en la primera conexión y la huella que nunca se acepta a ciegas, IPsec y WireGuard, S/MIME y PGP, el E2EE como concepto y el sellado de tiempo. Cierras con los ataques clásicos —downgrade, stripping con HSTS como respuesta, MITM con certificado falso y el papel real y los riesgos del pinning, repetición, oráculo de relleno y compresión— y con el error de implementación canónico, el verify=False, que conserva íntegro el coste de TLS y anula por completo su garantía.
Pero fíjate en cuántas veces has tenido que aplazar la misma respuesta. ¿Cómo sabe el cliente que ese certificado es de Nimbus? ¿Quién lo emitió y con qué garantía? ¿Qué pasa cuando la clave se filtra o el certificado caduca? ¿Cómo se monta la CA interna que necesitan el mTLS y los servicios internos? Toda la seguridad de este capítulo descansa sobre la validación de un certificado, y todavía no hemos abierto esa caja.
En Gestión de Claves, Certificados y PKI (03-06) entramos en lo que el módulo 2 anunció como «el problema realmente difícil», y la tesis es contundente: los algoritmos casi nunca fallan; la gestión de claves sí. Verás el ciclo de vida completo de una clave, dónde debe vivir —de la variable de entorno al HSM—, por qué borrar el commit del .env filtrado en el incidente de 02-06 no basta, cómo se rota sin cortar el servicio, qué contiene exactamente un certificado X.509, cómo funciona la cadena de confianza, qué garantizan las CA, cómo se emite con ACME, cómo se revoca y cómo la transparencia de certificados permite a Nimbus detectar un certificado emitido indebidamente para su dominio.
Curso de Fundamentos de Seguridad Informática
Módulo 1: Introducción a la Seguridad Informática
- Conceptos Básicos de Seguridad Informática
- Tipos de Amenazas y Vulnerabilidades
- Principios de la Seguridad Informática
- Activos, Superficie de Ataque y Actores de Amenaza
Módulo 2: Ciberseguridad
- Definición y Alcance de la Ciberseguridad
- Tipos de Ataques Cibernéticos
- Ingeniería Social y Phishing
- Medidas de Protección en Ciberseguridad
- Identidad, Autenticación y Control de Acceso
- Casos de Estudio de Incidentes de Ciberseguridad
Módulo 3: Criptografía
- Introducción a la Criptografía
- Criptografía Simétrica
- Criptografía Asimétrica
- Funciones Hash, HMAC y Almacenamiento de Contraseñas
- Protocolos Criptográficos
- Gestión de Claves, Certificados y PKI
- Aplicaciones de la Criptografía
Módulo 4: Gestión de Riesgos y Medidas de Protección
- Evaluación de Riesgos
- Políticas de Seguridad
- Controles de Seguridad
- Riesgo de Terceros y Cadena de Suministro
- Plan de Respuesta a Incidentes
- Recuperación ante Desastres y Continuidad de Negocio
Módulo 5: Herramientas y Técnicas de Seguridad
- Herramientas de Análisis de Vulnerabilidades
- Técnicas de Monitoreo y Detección
- Pruebas de Penetración
- Seguridad en Redes
- Seguridad en Aplicaciones
- Hardening de Sistemas y Seguridad del Endpoint
- Seguridad en la Nube y en Contenedores
Módulo 6: Buenas Prácticas y Normativas
- Buenas Prácticas en Seguridad Informática
- Normativas y Estándares de Seguridad
- Protección de Datos Personales y RGPD en la Práctica
- Cumplimiento y Auditoría
- Formación y Concienciación
- Ética, Aspectos Legales y Divulgación Responsable
