¿Qué es un conjunto de cifrado (cipher suite) y cómo funciona en SSL/TLS?

server_hello

Debido a las múltiples vulnerabilidades que se han identificado en las implementaciones de SSL y TLS en los últimos años (BEAST, CRIME, BREACH, HEARTBLEED, POODLE, FREAK, Logjam), una de las principales recomendaciones (adicional a la de actualizar los componentes asociados a estos protocolos) es la de emplear algoritmos de encriptación con longitudes de claves robustas. Para configurarlo, se hace uso de un “conjunto de cifrado” (“cipher suite”), que por lo general involucra cadenas como estas:

SSL_RSA_WITH_RC4_128_SHA

TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA

TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256

TLS_RSA_WITH_RC4_128_MD5

TLS_RSA_WITH_3DES_EDE_CBC_SHA

SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5

TLS_RSA_WITH_3DES_EDE_CBC_SHA

Pero, ¿qué significan exactamente estas líneas? A continuación analizaremos el significado de cada parte.

Descomponiendo el conjunto de cifrado (cipher suite)

Antes de empezar, es necesario recordar que SSL y TLS son protocolos criptográficos ubicados en la capa 5 del modelo OSI (capa de sesión) o, lo que es lo mismo, la capa de transporte en el modelo TCP IP. Estos protocolos ofrecen servicios de autenticación, encriptación, intercambio de claves de cifrado e integridad. Para gestionar cada una de estas características, se puede parametrizar un algoritmo específico en función de las necesidades tanto a nivel de cliente como a nivel de servidor.

Para establecer una comunicación bidireccional, el primer paso es que ambas partes (cliente y servidor) puedan negociar con cuáles algoritmos se va a trabajar y para ello, en el inicio de la comunicación, se presentan una serie de opciones por parte y parte:

tls-handshake

En una captura de tráfico usando Wireshark se puede observar con detalle lo que sucede en la comunicación:

wireshark

En este punto, dependiendo de la configuración, el cliente presenta su conjunto de cifrado a un servidor, que a su vez lo compara con su propio listado y negocian los algoritmos que se usarán para el resto de la transmisión.

La identificación del protocolo, los algoritmos y las longitudes de clave se organizan de la siguiente manera:

conjunto_de_cifrado

Para entenderlo, se analizará cada apartado de este conjunto:

  1. Protocolo (Protocol): Define el tipo de protocolo a usar, SSL o TLS. Esta primera parte solamente puede tener uno de los siguientes valores (en rojo los que debido a su riesgo no son recomendados):
    • SSL1
    • SSL2
    • SSL3
    • TLS1.0
    • TLS1.1
    • TLS1.2
    • TLS1.3 (borrador)
    • DTLS1.0
  2. Intercambio de claves (Key Exchange): Este apartado establece el algoritmo que se empleará para compartir la clave simétrica con la cual se encriptará el tráfico en la sesión. Los valores aceptados son:
  3. Firma digital (Digital Signature): Este apartado define los algoritmos que se emplearán para garantizar que los datos intercambiados entre cliente y servidor no han sido alterados. Algunas veces RSA puede ser usado para realizar intercambio de claves y firma digital:
  4. Algoritmo de encriptación simétrico y longitud de clave (Encryption (Cipher) and key length): El siguiente parámetro es el algoritmo simétrico y la longitud de la clave asociada, empleados para la encriptación de los datos transmitidos. Las opciones son las siguientes:
  5. Modo de encriptación (Encryption Mode) – Opcional: Este parámetro es opcional y depende del tipo de algoritmo de encriptación escogido anteriormente:
    • CBC
    • GCM
    • ECB
    • PCBC
    • CFB
    • OFB
    • CTR
  6. Algoritmo de hash (Hashing Algorithm): En este apartado se escoge el algoritmo para la validación de integridad del mensaje, con el fin de identificar potenciales manipulaciones no autorizadas del contenido:
  7. Tamaño de curva elíptica (Elliptic curve size) – Opcional: Dependiendo del algoritmo de intercambio de claves escogido, en este parámetro se antepone la letra “P” seguida de la curva a ser empleada:
    • P256
    • P384

Para mayor información acerca de configuraciones recomendadas, revisar el documento NIST Special Publication 800-52 “Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations”.

EXTRA: ¿Cómo extraer el conjunto de cifrado de un servidor empleando nmap?

nmap es una de las mejores herramientas de escaneo de puertos y obtención de información de configuración de servicios de red. Adicional a sus funcionalidades básicas, cuenta con una serie de scripts (NSE) e inclusive permite la obtención del conjunto de cifrado de un servicio SSL/TLS remoto a través del siguiente comando:

nmap --script ssl-enum-ciphers -p 443 HOST

La salida es similar a la siguiente, en donde se pueden aplicar los conceptos descritos anteriormente:

Host is up (0.058s latency).
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers:
|   SSLv3: No supported ciphers found
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|   TLSv1.1:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|   TLSv1.2:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA256 - strong
|       TLS_RSA_WITH_AES_128_GCM_SHA256 - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA256 - strong
|       TLS_RSA_WITH_AES_256_GCM_SHA384 - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|_  least strength: strong

Nmap done: 1 IP address (1 host up) scanned in 18.79 seconds

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.