Cómo funciona HTTPS
Hoy en día existen millones de personas que utilizan Internet y, muchas veces no saben que sus datos están expuestos al navegar por sitios no seguros. A diario visitamos sitios como Facebook, Gmail, Twitter o YouTube. Dichos sitios utilizan el protocolo HTTPS, que cifra los datos de nuestras comunicaciones para hacerlas más seguras.
Qué es HTTPS
HTTPS (Protocolo Seguro de Transferencia Hipertexto) funciona desde el puerto 443 y utiliza un cifrado basado en SSL/TLS con el fin de crear un canal cifrado entre el cliente y el servidor. SSL (Secure Sockets Layer) y TLS (Transmission Layer Security) son dos protocolos utilizados para enviar paquetes cifrados a través de Internet. Se pueden utilizar para más de un protocolo, no sólo con HTTP. HTTP + SSL/TLS = HTTPS.
Por qué usar HTTPS
No es complicado mencionar varias razones por las que es preferible usar HTTPS antes que HTTP. Al cifrar la comunicación entre cliente y servidor, evitamos los ataques man-in-the-middle o eavesdropping, mediante los cuales un atacante podría obtener por ejemplo, nuestro usuario y contraseña de un sitio web porque irían en texto plano.
He montado un Wordpress en una máquina virtual y he hecho un ataque man-in-the-middle para ver cómo se transmiten el usuario y la contraseña al acceder con un usuario de prueba. El nombre de usuario ha sido usuariodeprueba y la contraseña passdeprueba. Con Wireshark he "escuchado" la comunicación y he visto la transferencia de mensajes en texto plano. Aquí tenéis una captura en la que se ven perfectamente el nombre usuario y la contraseña:
Cómo funciona
HTTP funciona en la capa de aplicación (séptima capa) del Modelo OSI, que es la capa más alta. Sin embargo, el cifrado que da lugar a HTTPS, se realiza en una capa más baja, mediante SSL/TLS. HTTPS se basa en el sistema de clave pública y clave privada. El administrador de un servidor Web (yo, en el caso de Geeky Blogs) debe crear un certificado de clave pública, el cual debe estar firmado por una autoridad de certificación. Si no está firmado, el navegador Web no lo aceptará y nos dirá que el sitio no es seguro. Si el sitio es seguro, veremos un candado cerrado en la URL del navegador. Por ejemplo en Google Chrome se ve así:
Intercambio de claves
La seguridad de las transacciones se basa en el intercambio de claves entre un cliente y un servidor. Las claves pública y privada están relacionadas de tal forma que no podemos usar una sin la otra. Para enviar un mensaje cifrado a un servidor, lo cifro con su clave pública para que él pueda descifrarlo con su clave privada. Sólo quien tenga la privada podrá descifrarlo. Por eso es importante tenerla siempre a buen recaudo.
Tras haber concretado los detalles técnicos que se utilizarán en la transferencia, como por ejemplo la versión del protocolo o los algoritmos de cifrado, el navegador procede a cifrar una clave generada en ese mismo momento con la clave pública del servidor al que se está conectando y se la envía. Al final el cliente y el servidor tienen la misma clave, que se utilizará para cifrar y descifrar los datos de la comunicación.
Debilidades, desventajas y limitaciones
Si un atacante robara el certificado con la clave privada de Geeky Theory, podría crear un servidor falso al cual podríamos acceder y entregar sin saberlo todos nuestros datos. Un paso más allá sería que si la clave privada de un CA (Certificate Authority) fuera robada, el ladrón podría crear y firmar certificados falsos para cualquier dominio y hacer que los usuarios se conectasen a servidores falsos sin que se den cuenta.
Al implementar HTTPS en una página Web podemos afirmar que estamos transmitiendo más datos que si se utilizara HTTP. El volumen de tráfico es mayor y se ralentiza la Web al tener que realizar el cifrado. ¿Por qué no usar HTTPS sólo en la página de acceso para introducir los datos del usuario? El usuario y contraseña irían cifrados pero, ¿qué pasaría con las cookies? Si las cookies van en texto plano, cifrar el usuario y la contraseña no vale de nada.
Por qué lo hemos implementado en Geeky Blogs
Actualmente tenemos más de 1000 usuarios registrados en Geeky Blogs. Muchos hacen login cada día varias veces para enviarnos artículos o publicar comentarios. Imaginad que están en una universidad o en una red que no es la de su casa y hay un atacante realizando un man-in-the-middle. Sin cifrar la comunicación, se vería su usuario y contraseña en texto plano y se podría suplantar su identidad. Sin embargo, al utilizar HTTPS será mucho más complicado tener éxito al realizar el ataque.
Tener esta cantidad de usuarios me hizo plantearme seriamente el comprar varios certificados e invertir vuestra seguridad (y la mía). Podría haber configurado el servidor para que cada uno elija si utilizar HTTP o HTTPS, pero prefiero que los datos del usuario estén bien protegidos, aunque haya que sacrificar algo de velocidad.
Espero que os guste esta decisión que he tomado.