Aspectos básicos de SSL/TLS
Por Arrecio
SSL/TLS es en realidad TLS manteniendo la referencia a SSL de Secure Socket Layer por cuestiones románticas.
SSL/TLS es un protocolo de comunicación entre partes de una red que permite conexiones seguras y resulta ampliamente usando tanto en la web como en otros servicios de Internet. Es el estándar de conexiones seguras y el protocolo de comunicación en todo tipo de infraestructuras. Aúna sistemas de criptografía tanto simétrica como asimétrica.
Un buen punto para resumir su funcionamiento de TLS es hablar de esto último. El cifrado de mensajes forma parte de cualquier tipo de comunicación segura que utilice el dominio público como medio de transmisión. Cuando abres una web en un lugar remoto los paquetes de red que circulan entre los dos puntos lo hacen a traves de nodos de terceros desde los que se podría interceptar los mensajes. La criptografía permite que cualquier curioso que intente visualizar tales mensajes los encuentre ininteligibles no pudiendo descifrarlo sin las claves adecuadas.
Existen varias alternativas de cifrado distinguiéndose entre cifrados de clave simétrica y de clave asimétrica. Por señalar algunas de sus diferencias, en la práctica el cifrado asimétrico resulta mucho más costoso en tiempo y recursos que el simétrico es por ello que para el alto tráfico como puede ser el de la www lo más recomendable es el cifrado simétrico.
En el cifrado simétrico ambos extremos de la comunicación utilizan la misma clave. Las funciones de cifrado y descifrado utilizan la misma clave. En el caso de la de cifrado recibe el mensaje original y la clave, produciendo un mensaje encriptado. La función de descifrado recibe un mensaje cifrado y la misma clave, dando como salida el mensaje original.
En esencia un sistema de cifrado simétrico se puede definir como una tupla de dos funciones y una clave $(f,g,K)$ que teniendo en cuenta un mensaje $m$ se cumple que:
$$\relax g(f(m,K),K) = m$$
Los sistemas de cifrado simétrico más utilizados en la actualidad son RC2, RC4, IDEA, DES, 3DES y AES.
La principal vulnerabilidad del cifrado simétrico radica precisamente en asegurar la confidencialidad de la clave de cifrado.
La particularidad del cifrado asimétrico radica en que la clave de cifrado y la de descifrado son distintas recibiendo el nombre de clave pública y clave privada respectivamente. Por simplificar podríamos decir que consiste en un sistema de dos funciones y dos claves $(f,g,K,K')$ que teniendo en cuenta un mensaje $m$ se cumple que:
$$\relax g(f(m,K),K') = m$$
La ventaja del cifrado asimétrico es que la clave pública puede ser distribuida sin riesgo, ya que a la hora de descifrar el mensaje no tiene utilidad. La desventaja está en el consumo computacional, tanto en tiempo como en otro tipo de recursos, que es mayor en el caso de los algoritmos de clave asimétrica que en los de clave simétrica. Es por ello que sistemas que usan SSL/TLS lo hacen de manera híbrida, utilizando encriptación asimétrica para establecer la conexión e intercambiar la clave maestra a utilizar en comunicación encriptada de manera simétrica a partir de entonces.
Algoritmos de cifrado asimétrico son RSA, Diffie-Hellman, DSA o Fortezza.
Pero que un canal sea cifrado, y por ende, presuntamente seguro, en muchas situaciones no es suficiente. Esto sucede cuando además queremos verificar la identidad de alguna de las partes, o de ambas.
El apretón de manos TLS
El TLS Handshake es el procedimiento de conexión entre partes utilizando el protocolo SSL/TLS. Si hablamos del caso general en el que se quiere establecer una vía de comunicación segura con un determinado servidor, lo que ocurre por ejemplo cuando accedemos a webs mediante https entonces se puede describir gráficamente cómo sigue:
El procedimiento dibujado arriba es lineal. El cliente inicia la conexión con el servidor mediante del envío de un mensaje ClientHello acompañado del conjunto de cifrados y métodos de compresión que podría utilizar así como de la versión SSL más alta permitida. Igualmente lanza un número aleatorio client_challenge.
Recibido el intento de conexión, si el servidor admite tanto el conjunto de cifrados como la versión TLS retornará un mensaje ServerHello indicando cual de los métodos de cifrado será el utilizado, así como la versión TLS del protocolo a utilizar. Igualmente remite un número aleatorio server_challenge.
A continuación el servidor envía al cliente su certificado digital X.509 mediante el mensaje c, entre sus elementos estará la la clave pública, así como como también los datos relativos a la identidad del servidor. Si el método de cifrado requiere configuración adicional estos parámetros también se envían en este momento mediante un mensaje ServerKeyExchange. En los sistemas de comunicación con autenticación mutua (mTLS) se solicita adicionalmente esto mediante un mensaje CertificateRequests, notar que este no aparece en el gráfico que estamos analizando.
Finalmente envía un mensaje ServerHelloDone para indicar que esta fase ha acabado.
Con el certificado del servidor en su poder el cliente comprueba su autenticidad a través de su Autoridad de Certificación (CA), verificada su autenticidad este utiliza la clave pública contenida en el certificado para enviar en un mensaje ClientKeyExchange lo que se conoce como pre-master key la cual estará cifrada con la clave pública del servidor. No obstante si estamos ante un mTLS se envía con carácter previo el certificado de cliente mediante un mensaje Certificate y que será verificado por el servidor y decidirá rechazar la conexión si este no es válido.
En este momento ambas partes deben generar la master key o clave de sesiónque será la que se utilizará para cifrar mediante el sistema simétrico elegido todo el tráfico restante. La generación se realiza en ambos extremos utilizando la función elegida la cual recibe tres parámetros: el número aleatorio de cliente, el número aleatorio de servidor y el pre-master key. Necesariamente en ambos extremos se llegará al mismo resultado. El intercambio del mensaje ChangeCipherSpec indica precisamente que ambas partes están listas para usar el método de cifrado elegido para seguir con la comunicación. Ambas partes además notifican que por su parte se ha acabado el apretón de manos de manera positiva mediante el intercambio de mensajes Finished.
Referencias: rfc8446 y para los que somos un poco más torpes ¿Qué es un protocolo de enlace TLS? by Cloudfare