SSL
El protocolo SSL (Secure Sockets Layer) fue desarrollado por la empresa Netscape en 1994 para garantizar la seguridad en el intercambio de datos entre un navegados y un servidor web, siendo en la actualidad el más utilizado para realizar transacciones comerciales en internet. SSL permite garantizar la confidencialidad, la autenticación y la integridad de los mensajes intercambiados.
Para ofrecer el servicio de integridad de los mensajes se recurre a un código de autenticación de mensajes (MAC, Message Authentication Code).
SSL implica una serie de fases básicas:
- Negociar entre las partes el algoritmo que se usará en la comunicación
- Intercambio de claves públicas y autenticación basada en certificados digitales
- Cifrado del tráfico basado en cifrado simétrico
Durante la primera fase, el cliente y el servidor negocian qué algoritmos criptográficos se van a usar. Las implementaciones actuales proporcionan las siguientes opciones:
- Para criptografía de clave pública: RSA, Diffie-Hellman, DSA (Digital Signature Algorithm) o Fortezza.
- Para cifrado simétrico: RC2, RC4, IDEA (International Data Encryption Algorithm), DES (Data Encryption Standard), Triple DES y AES (Advanced Encryption Standard).
- Con funciones hash: MD5 o de la familia SHA.
Funcionamiento
El protocolo SSL intercambia registros; opcionalmente, cada registro puede ser comprimido, cifrado y empaquetado con un código de autenticación del mensaje (MAC). Cada registro tiene un campo de content_type que especifica el protocolo de nivel superior que se está usando.
Cuando se inicia la conexión, el nivel de registro encapsula otro protocolo, el protocolo handshake (o protocolo de acuerdo), que tiene el content_type 22.
El cliente envía y recibe varias estructuras handshake:
- Envía un mensaje ClientHello especificando una lista de conjunto de cifrados, métodos de compresión y la versión del protocolo SSL más alta permitida. Éste también envía bytes aleatorios que serán usados más tarde (llamados Challenge de Cliente o Reto). Además puede incluir el identificador de la sesión.
- Después, recibe un registro ServerHello, en el que el servidor elige los parámetros de conexión a partir de las opciones ofertadas con anterioridad por el cliente.
- Cuando los parámetros de la conexión son conocidos, cliente y servidor intercambian certificados (dependiendo de las claves públicas de cifrado seleccionadas). Estos certificados son actualmente X.509, pero hay también un borrador especificando el uso de certificados basados en OpenPGP.5
- Cliente y servidor negocian una clave secreta (simétrica) común llamada master secret, posiblemente usando el resultado de un intercambio Diffie-Hellman, o simplemente cifrando una clave secreta con una clave pública que es descifrada con la clave privada de cada uno. Todos los datos de claves restantes son derivados a partir de este master secret (y los valores aleatorios generados en el cliente y el servidor), que son pasados a través una función pseudoaleatoria cuidadosamente elegida.
TLS/SSL poseen una variedad de medidas de seguridad:
- Numerando todos los registros y usando el número de secuencia en el MAC.
- Usando un resumen de mensaje mejorado con una clave (de forma que solo con dicha clave se pueda comprobar el MAC). Esto se especifica en el RFC 2104).
- Protección contra varios ataques conocidos (incluyendo ataques man-in-the-middle), como los que implican un degradado del protocolo a versiones previas (por tanto, menos seguras), o conjuntos de cifrados más débiles.
- El mensaje que finaliza el protocolo handshake (Finished) envía un hash de todos los datos intercambiados y vistos por ambas partes.
- La función pseudo aleatoria divide los datos de entrada en 2 mitades y las procesa con algoritmos hash diferentes (MD5 y SHA), después realiza sobre ellos una operación XOR. De esta forma se protege a sí mismo de la eventualidad de que alguno de estos algoritmos se revelen vulnerables en el futuro.
SSL se ejecuta en una capa entre los protocolos de aplicación como HTTP, SMTP, NNTP y sobre el protocolo de transporte TCP, que forma parte de la familia de protocolos TCP/IP. Puede proporcionar seguridad a cualquier protocolo que use conexiones de confianza (tal como TCP).
Las conexiones SSL sobre HTTP se establecen a través del puerto 443, y además se puede distinguir por la dirección de la página web que comienza así https://…
La actual limitación de este protocolo viene dada por no garantizar la autenticación del cliente, ya que no exige que éste disponga de clave pública avalada por un certificado digital (la versión 3 (SSL 3.0) si contempla la utilización de certificados digitales en el cliente).
Para garantizar la seguridad de la conexión, la clave no puede ser menor a 128 bits para el cifrado simétrica y de 1.024 bits para el algorítmo de cifrado asimétrica (clave pública de 1.024 bits).
Se deberá verificar si los certificados siguen válidos (que no están revocados o su período de validez sigue vigente).
Ejemplo:
- EL cliente (browser) envía un mensaje de saludo al Server “ClientHello”
- El servidor responde con un mensaje “ServerHello”
- El servidor envía su certificado
- El servidor solicita el certificado del cliente
- El cliente envía su certificado: si es válido continua la comunicación si no para o sigue la comunicación sin certificado del cliente
- El cliente envía un mensaje “ClientKeyExchange” solicitando un intercambio de claves simétricas si es el caso
- El cliente envía un mensaje “CertificateVerify” si se ha verificado el certificado del servidor, en caso de que el cliente este en estado de autenticado
- Ambos cliente y servidor envían un mensaje “ChangeCipherSpec” que significa el comienzo de la comunicación segura.
- Al término de la comunicación ambos envían el mensaje “finished” con lo que termina la comunicación segura, este mensaje consiste en un intercambio del hash de toda la conversación, de manera que ambos están seguros que los mensajes fueron recibidos intactos (íntegros).