LabWebAv06 WebSocketSeguro
LabWebAv06 WebSocketSeguro
LabWebAv06 WebSocketSeguro
OBJETIVO:
Los estudiantes serán capaces de comprender y aplicar el uso de websockets seguros para facilitar la
comunicación bidireccional y en tiempo real entre clientes y servidores web, garantizando la seguridad y
privacidad de la información transmitida.
MATERIALES Y RECURSOS:
Computador con acceso a Internet
Entorno de desarrollo web -> Visual Studio Code (https://code.visualstudio.com/download)
Open SSL (https://www.openssl.org/)
NodeJS instalado (https://nodejs.org/)
o NPM Packages: Express + WS
Navegador web moderno compatible con WebSocket (por ejemplo, Google Chrome o Mozilla
Firefox).
INTRODUCCIÓN:
Vamos a explorar los riesgos de seguridad asociados con la comunicación en tiempo real y cómo los
websockets seguros (WebSocket Secure, WSS) mitigan estos riesgos mediante el uso de encriptación y
certificados SSL/TLS. Revisaremos buenas prácticas de seguridad, como validación de datos, manejo
adecuado de errores y control de acceso, para garantizar la integridad y seguridad de la información
transmitida a través de websockets. Finalmente vamos a implementar websockets seguros mejorando la
aplicación de chat, previamente generada, para demostrar la comprensión y aplicación práctica de los
conceptos enseñados.
OPENSSL:
OpenSSL es una biblioteca de software de código abierto que se utiliza ampliamente para implementar
protocolos de seguridad de comunicaciones en línea, como SSL (Secure Sockets Layer) y su sucesor, TLS
(Transport Layer Security). Estos protocolos se emplean para asegurar las comunicaciones a través de
internet, proporcionando cifrado para garantizar la privacidad y autenticación para verificar la identidad
de los extremos de la comunicación. Las funciones principales de OpenSSL incluyen: Cifrado y
descifrado, creación y gestión de certificados, implementación de protocolos de seguridad, funciones
criptográficas, y herramientas de línea de comandos que permiten realizar diferentes operaciones
criptográficas, generar certificados, realizar pruebas de conexión segura.
SSL/TLS:
SSL (Secure Sockets Layer) y TLS (Transport Layer Security) son protocolos criptográficos diseñados para
garantizar la seguridad en las comunicaciones a través de internet. SSL fue desarrollado por Netscape a
mediados de la década de 1990 para asegurar las comunicaciones en línea. Posteriormente, debido a
vulnerabilidades y debilidades detectadas en SSL, se desarrolló TLS como su sucesor. TLS 1.0 se basó en
SSL 3.0, con mejoras significativas en seguridad. Las versiones posteriores de TLS han continuado
mejorando la seguridad y las capacidades de cifrado. Las versiones de SSL van desde la 1.0 (nunca se
lanzó públicamente debido a fallas de seguridad), 2.0 y 3.0 (lanzado en 1996). Luego vinieron TLS 1.0,
1.1, 1.2, 1.3 (sucesores de SSL con mejoras de seguridad, rendimiento y capacidad). TLS es más seguro
que SSL debido a la solución de muchas vulnerabilidades conocidas en las versiones anteriores de SSL.
Las implementaciones modernas y seguras de la seguridad en internet utilizan principalmente TLS, con
versiones más recientes (como TLS 1.2 y 1.3) que ofrecen mejoras significativas en la seguridad y
rendimiento en comparación con SSL. En el sitio web “https://caniuse.com/?search=TLS” se puede
verificar qué versiones de TLS soportan los navegadores modernos.
LOS ARCHIVOS CERT.PEM Y KEY.PEM
Los archivos cert.pem y key.pem generados con OpenSSL tienen roles específicos en la configuración de
seguridad de un servidor web, especialmente cuando se utiliza el protocolo SSL/TLS para habilitar
conexiones seguras. Ambos archivos, cert.pem y key.pem, son cruciales para la configuración de SSL/TLS
en un servidor web. El certificado (cert.pem) se comparte públicamente para que los clientes verifiquen
la identidad del servidor, mientras que la clave privada (key.pem) se mantiene en secreto y se utiliza
para desencriptar los datos que han sido encriptados usando la clave pública asociada al certificado.
Estos archivos se utilizan en la configuración de servidores web como IIS, Apache, Nginx, Node.js, entre
otros, para habilitar conexiones seguras a través de HTTPS mediante la implementación de SSL/TLS.
Desde el sitio web nos podemos descargar el código fuente de OpenSSL para compilarlo y generar el
ejecutable, sin embargo, para evitar esto, podemos descargarnos un instalador liviano de
“https://slproweb.com/products/Win32OpenSSL.html”
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
O desde un computador Mac:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
Nos aparecerá una pantalla donde nos pedirá que completemos información, se sugiere colocar lo
siguiente:
Desde la carpeta “server” modificamos el archivo llamado “index.js”, con el siguiente código:
// SSL credentials
const server = https.createServer({
cert: fs.readFileSync('cert.pem'),
key: fs.readFileSync('key.pem')
}, app);
app.use(express.static(path.join(__dirname, '../client')));
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../client', 'index.html'));
});
server.listen(3000, () => {
console.log('WebSocket Server running on port 3000');
});
En este caso ya no podemos lanzar la ejecución desde la página web desde LiveServer, sino que
debemos abrir un navegador, para este ejemplo usamos “Edge” y en la barra de direcciones ingresar:
https://localhost:3000/
Al realizar esto aparecerá un mensaje que nuestra conexión no es privada y hay un error en el
certificado, ya que estamos usando un certificado que nosotros mismo emitimos y está autofirmado
para uso en nuestro ambiente de desarrollo, por lo que no fue emitido por una CA (Certification
Authority) válida, por lo que para poder continuar con nuestras pruebas presionamos el botón
“Advance” y hacemos clic en el botón “Continue to localhost (unsafe)”:
Finalmente podemos ya visualizar nuestra pantalla de Chat. Si abrimos las herramientas de
desarrollador (Developer Tools) podemos seleccionar la opción “Network” para ver los archivos que se
están cargando.
Al hacer clic en la opción “localhost” podemos ver la información de las cabeceras (headers) del
protocolo websocket, corroborando que estamos usando wss que es websocket seguro.
ENTREGABLE FINAL
6. Entregable