TLS

(Transport Layer Security/rfc8446)

(antes de TLS 1.0 $\rightarrow$ SSL, Secure Sockets Layer)

Creative Commons License
“Curso de Introducción a la Criptografía” by Jordi Íñigo Griera is licensed under a
Creative Commons Attribution 4.0 International License.
Project hosted at github.com/jig/crypto

red

Ubicación de TLS dentro de la pila TCP/IP en aplicaciones HTTPS

Layer 1 HTTP TLS TCP IP Ethernet HTTPS

TLS: funciones

Funcionalmente equivalente a un socket TCP aportándole:

  • autenticidad: Clave pública
    • autenticación mutua: cliente y servidor tienen certificado${}^\dagger$/PVK
    • autenticación de servidor: el cliente no precisa certificado/PVK
  • integridad: HMAC/MAC
  • confidencialidad: cifrado asimétrico de claves + cifrado simétrico
  • confidencialidad persistente${}^\ddagger$: acuerdo de claves + cifrado simétrico


$\dagger$) el certificado es una PBK (veremos certificados en detalle en PKI)

$\ddagger$) PFS: Perfect Forward Secrecy implica no usar cifrado asimétrico

TLS: autenticación

  • autenticación mutua: cliente y servidor tienen certificado/PVK
  • autenticación de servidor: el cliente no precisa certificado/PVK

  • servidor: clave privada habitualmente en fichero en claro protegido únicamente por el SO (ACL) o en HSM con activación automática
  • cliente:
    • sin autenticación de cliente: anónimo, usuario y contraseña, etc.
    • con autenticación de cliente: fichero PKCS #12, o accediendo a un HSM en forma de SmartCard o de token USB vía librería PKCS #11

TLS: historia

TLS es el succesor del SSL y ha ido evolucionando por diferentes versiones en respuesta a los diferentes ataques teóricos y prácticos que han ido surgiendo

los clientes cuando se conectan acuerdan utilizar la versión más moderna que soporten ambos extremos:

  • SSL 3.0 $\rightarrow$ obsoleto
  • TLS 1.0 $\rightarrow$ mínima versión del protocolo utilizable; fin de vida en 2020
  • TLS 1.1 $\rightarrow$ fin de vida en 2020
  • TLS 1.2 $\rightarrow$ versión recomendada
  • TLS 1.3 $\rightarrow$ publicada en 2018; fuerza a utilizar DHE/ECDHE para acuerdo de claves

inicialización (resumen; suponiendo caché TLS vacía) *

ClientHello $\longrightarrow$
contiene un random, cipher-suites soportados, versión

$\longleftarrow$ ServerHello
contiene un random, session-ID, y la versión de TLS y el cipher-suite usado

$\longleftarrow$ Certificate
cadena de certificados incluyendo el del servidor

$\longleftarrow$ ServerKeyExchange
(si DHE) parámetros DH y su clave pública (efímera: InputSecret)

$\longleftarrow$ CertificateRequest$\dagger$
(si el servidor requiere autenticación de cliente) DN's de las CA aceptadas

$\longleftarrow$ CertificateVerify
firma de los mensajes anteriores

Certificate $\longrightarrow$
(si el servidor requiere autenticación de cliente) cadena de certificados incluyendo la del cliente

ClientKeyExchange $\longrightarrow$
(si DHE) clave pública DH (efímera: InputSecret)

CertificateVerify$\dagger$ $\longrightarrow$
(si el servidor requiere autenticación de cliente) firma de los mensajes anteriores

Protocol: inicialización (caso PFS)

a partir de los dos InputSecret se genera el MasterSecret

del MasterSecret se derivan 4 claves y 2 IV:

  • clave de cifrado de cliente a servidor (y viceversa)
  • IV, para el cifrado de cliente a servidor (y viceversa)
  • clave HMAC de cliente a servidor (y viceversa)

InputSecretcliente: $\alpha^i$
InputSecretservidor: $\alpha^j$
MasterSecret: $ = \alpha^{ij}$

Protocol: inicialización (caso no-PFS)

En el caso de no usar DHE (ni ECDHE) el cliente debe enviar el MasterSecret al servidor cifrándolo con la clave del servidor:

MasterSecret: PBKservidor(MasterSecretcliente)

En este caso (no-PFS) una revelación de la clave privada del servidor en cualquier momento, permite descifrar el tráfico futuro y también el tráfico pasado. Con PFS esto no sucede ya que las claves de efímeras (EDH ó ECDHE) cambian en cada acuerdo y no se almacenan nunca

protocolo: transporte (record)

los datos se fragmentan en bloques de hasta 16 kB

cada bloque está protegido por algoritmos simétricos acordados durante la inicialización y las claves y IV's derivados de la MasterKey...

y por un número de secuencia

Cipher suites

Se identifican (aprox) con la cadena KEA_SIGN_WITH_CIPHER_HASH

Componente Contenido
KEAalgoritmo de acuerdo de claves
SIGNalgoritmo de firma
CIPHERalgoritmo de cifrado simétrico
HASHalgoritmo de hash

Algoritmos en TLS v1.3

los siguientes cipher-suites son de obligada implementación (MUST):
{DHE|ECDHE}_ECDSA_WITH_AES_128_GCM_SHA256
{DHE|ECDHE}_RSA_WITH_AES_128_GCM_SHA256

y se recomienda la implementación de estos (SHOULD):
{DHE|ECDHE}_ECDSA_WITH_AES_256_GCM_SHA384
{DHE|ECDHE}_ECDSA_WITH_CHACHA20_POLY1305_SHA256
{DHE|ECDHE}_RSA_WITH_AES_256_GCM_SHA384
{DHE|ECDHE}_RSA_WITH_CHACHA20_POLY1305_SHA256

Notas:

  • claves de sesión establecidas por acuerdo de claves (PFS)
  • DH-2048, ECDH-256, X25519: longitudes mínimas para acuerdo de claves
  • RSA-2048, ECDSA-256, EdDSA25519: longitudes mínimas para firma
  • desaparecen DSA, SHA-1, SHA-224, 3DES

Cipher suites

Valores previstos para cada campo de KEA_SIGN_WITH_CIPHER_HASH
aunque pueden cambiar

Componente Contenido
KEADHE, ECDHE
$\quad \Rightarrow$ sólo variantes efímeras DH
SIGNRSA, ECDSA
$\quad \Rightarrow$ desaparece DSA
CIPHERAES-128, AES-256, ChaCha20
$\quad \Rightarrow$ desaparecen 3DES, RC4,
HASHSHA-2, Poly1305
$\quad \Rightarrow$ desaparecen MD5, SHA-1, SHA-2/224

Seguridad

  • Algoritmos: TLS hasta la versión v1.2 permite configurar algoritmos (cipher suites) que actualmente son obsoletos
  • Protocolo: versiones antiguas, mecanismos de renegociación (para bajar a versiones antiguas)…
  • Implementaciones: limitación de parámetros, uso de PRNG de baja calidad
  • Condiciones de uso: gestión del servidor (o el cliente)

Seguridad: Algoritmos

TLS hasta la versión v1.2 permite configurar algoritmos obsoletos (v1.3 lo impide pero su publicación es muy reciente como para que todos los componentes lo hayan adoptado)

TLS hasta la versión v1.2 renegocia el mejor protocolo entre cliente y servidor. Un cliente "antiguo" puede forzar a usar o bien un cipher suite obsoleto o bien no dejarlo conectar

cipher-suites TLS v1.2...

TLS_RSA_WITH_NULL_MD5 TLS_RSA_WITH_NULL_SHA TLS_RSA_WITH_NULL_SHA256 TLS_RSA_WITH_RC4_128_MD5 TLS_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_DH_anon_WITH_RC4_128_MD5 TLS_DH_anon_WITH_3DES_EDE_CBC_SHA TLS_DH_DSS_WITH_AES_128_CBC_SHA TLS_DH_RSA_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_DH_anon_WITH_AES_128_CBC_SHA TLS_DH_DSS_WITH_AES_256_CBC_SHA TLS_DH_RSA_WITH_AES_256_CBC_SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLS_DH_anon_WITH_AES_256_CBC_SHA TLS_DH_DSS_WITH_AES_128_CBC_SHA256 TLS_DH_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DH_anon_WITH_AES_128_CBC_SHA256 TLS_DH_DSS_WITH_AES_256_CBC_SHA256 TLS_DH_RSA_WITH_AES_256_CBC_SHA256 TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 TLS_DH_anon_WITH_AES_256_CBC_SHA256 TLS_ECDH_ECDSA_WITH_NULL_SHA TLS_ECDH_ECDSA_WITH_RC4_128_SHA TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_NULL_SHA TLS_ECDHE_ECDSA_WITH_RC4_128_SHA TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDH_RSA_WITH_NULL_SHA TLS_ECDH_RSA_WITH_RC4_128_SHA TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_NULL_SHA TLS_ECDHE_RSA_WITH_RC4_128_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_ECDH_anon_WITH_NULL_SHA TLS_ECDH_anon_WITH_RC4_128_SHA TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA TLS_ECDH_anon_WITH_AES_128_CBC_SHA TLS_ECDH_anon_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384

Seguridad: Algoritmos (TLS v1.3)

en la versión v1.3 se han eliminado cualquier algoritmo que resulte en un cipher-suite inseguro, facilitando la configuración segura de los servidores

⇒ eliminados NULL, ANON, sin acuerdo de claves, con acuerdo de claves no efímero, SHA-1, 3DES, DSS (DSA)

la lista de cipher-suites que se mantiene en v1.3 es:

TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

se debe vigilar que RSA y DHE sean de 2048 bit o más, y que ECDSA y ECDH usen P-256, P-384, P-521, Curve25519 ó Curve448

problema: S.O. antiguos no podrán conectarse

Seguridad «a futuro»:
Perfect Forward Secrecy

un ataque que revele una clave privada implica que se debe cambiar la clave privada

pero si no se usa _DHE_ ó _ECDHE_ el revelado de la clave privada permite el descifrado de tráfico pasado

Seguridad: Protocolo

  • versiones antiguas
  • versiones nuevas pero con soporte de mecanismos de renegoaciación de versión TLS (para bajar a versiones antiguas);
    TLS 1.0 debe ser la versión mínima soportada
    (las anteriores (SSL v3) están rotas)
  • versiones nuevas pero con soporte de mecanismos de renegoaciación de algoritmos antiguos (algoritmos export grade)

problema: S.O. antiguos no podrán conectarse

Seguridad: Implementaciones

hay muchas implementaciones de TLS: es recomendable usar implementaciones abiertas y ampliamente usadas (e.g. OpenSSL); pero también esto implica hay más difusión de herramientas para explotar las vulnerabilidades cuando las haya

  • generación de claves (debilidad en el RNG Debian/Ubuntu)
  • explotación de buffer overflows

Seguridad: condiciones de uso

  • claves protegidas (sólo) por el S.O.
  • las claves en claro están expuestas (ataques, aparición en backups, scripts de despliegue)
  • (históricamente) los certificados han sido caros ()
  • (actualmente) deben regenerarse frecuentemente (certificados de corta duración)

Confianza

los datos se protegen con CIPHER_HASH

$\downarrow$

derivadas con KEA

$\downarrow$

autenticadas (los secretos) con SIGN

$\downarrow$

Claves públicas de servidor y cliente (opcionalmente)
?