Implementación de TLS/SSL en Python
Kingsley Ubah
16 de octubre de 2022
0 minutos de lecturaHoy en día, hacemos prácticamente todo en línea: reservamos vuelos, pagamos productos, transferimos fondos bancarios, enviamos mensajes a nuestros amigos, almacenamos documentos y mucho más. Muchas de estas actividades requieren que compartamos información confidencial, como los datos de nuestra tarjeta de crédito y nuestra información bancaria. Si un sitio web usa una red no segura, un hacker malicioso puede robar fácilmente la información de los usuarios. Por eso, el cifrado es tan importante.
El protocolo de seguridad de la capa de transporte (TLS) es la protección definitiva de la información de los usuarios en sitios web y aplicaciones web. TLS usa un algoritmo criptográfico difícil de descifrar que garantiza que nadie, excepto el servidor y el cliente web, pueda leer o modificar los datos transmitidos.
En este artículo, exploraremos TLS y cómo usar Python para verificar la validez del certificado TLS de un sitio web. Luego, veremos paso a paso cómo agregar TLS a tu aplicación de Python en Linux.
Entender TLS/SSL
El protocolo TLS, sucesor del protocolo de capa de sockets seguros (SSL), protege los datos mediante el cifrado. Cuando los usuarios envían su información a un sitio web, TLS la cifra antes de transmitirla. Luego, solo el servidor con la misma clave pública que el cliente puede abrir el mensaje. Esta regla también se aplica cuando el servidor envía información al cliente. Solo el cliente con la clave correspondiente puede leer los datos.
Para que un sitio web use el protocolo TLS, debes instalar un certificado TLS/SSL válido (a menudo llamado certificado SSL). Al instalarlo, el sitio web pasa de HTTP a HTTPS, un protocolo de transferencia más seguro. El certificado es un archivo de datos que contiene la identidad del sitio web y la clave pública para abrir los mensajes de carga útil.
Un certificado SSL debe ser válido para funcionar. Esto significa que no solo debe estar firmado por una autoridad de certificación (CA) confiable, sino que también debe estar vigente. Todos los certificados tienen una fecha de emisión y una fecha de vencimiento. Un certificado deja de ser válido después de su fecha de vencimiento.
Los sitios web sin un certificado SSL válido tienen pocos indicadores visibles. Por ejemplo, la URL en la barra de direcciones usa el prefijo HTTP:// en lugar de HTTPS://. Además, no aparece un ícono de candado junto a la URL, que los navegadores usan para indicar que un sitio es seguro. Ten cuidado con lo que compartes si notas alguna de estas señales.
Ahora que exploramos TLS sobre SSL (TLS/SSL), veamos cómo implementarlo con Python.
Cómo trabajar con TLS/SSL en Python
Al crear un servidor web con Python, es fundamental saber cómo agregar TLS/SSL a nuestra aplicación. Antes de aprender a hacerlo, veamos cómo usar Python para verificar la validez del certificado SSL de un sitio web.
Verificar si un sitio web tiene un certificado SSL válido
Si queremos verificar la validez del certificado SSL de un sitio web, podemos hacerlo fácilmente ejecutando un script de Python como este:
El código anterior importa el módulo de Python requests y lo usa para enviar una solicitud GET al sitio web de Twitter. (Para ejecutar el script, debes instalar el módulo requests en Python con pip). Podemos reemplazar la URL de Twitter por la del sitio web cuyo certificado SSL queremos verificar. La variable response almacena el valor recibido, que el código imprime en la última línea.
Al ejecutar el código, obtenemos el mensaje <Response [200]> (OK), lo que significa que el sitio de Twitter usa un certificado SSL válido (como esperábamos).
Ahora, enviamos una solicitud GET a otro sitio web. Esta vez usamos un sitio del que sabemos que no tiene un certificado SSL válido.
Esta vez, recibimos un error que indica que falló el proceso de verificación del certificado:
La biblioteca SSL de Python
Usamos la biblioteca SSL de Python para proporcionar cifrado TLS en la comunicación basada en sockets entre clientes y servidores de Python. Usa criptografía y resúmenes de mensajes para proteger los datos y detectar intentos de alteración en la red. Los certificados digitales proporcionan autenticación.
La biblioteca SSL es compatible con Windows, macOS y otros sistemas UNIX modernos. También requiere OpenSSL para funcionar.
Hacia el final de este artículo, usaremos la biblioteca SSL de Python para proteger nuestro socket basado en conexiones con el certificado SSL que generaremos en la siguiente sección.
Crear un certificado SSL autofirmado en Python
Ahora que sabemos cómo verificar la validez de TLS/SSL en un sitio web, veamos cómo podemos usarlo en un servidor web de Python.
Podemos generar y usar rápidamente un certificado autofirmado gratuito para desarrollo local. Sin embargo, si pensamos implementar el sitio o la aplicación en Internet, debemos comprar un certificado SSL a un registrador de dominios confiable (como GoDaddy y NameCheap).
El proceso para generar un certificado SSL para nuestra aplicación local de Python tiene tres pasos:
Crear la clave privada RSA.
Generar una solicitud de firma de certificado (CSR) con la clave privada.
Firmar la solicitud CSR para crear el certificado.
Después de crear el certificado SSL, lo usaremos en una aplicación de Python al realizar solicitudes a la API.
Una vez más, compra siempre un certificado SSL únicamente a una autoridad de certificación autorizada. Muchos registradores de dominios incluyen un certificado SSL gratuito cuando compras un dominio.
¡Empecemos!
Requisito previo: instalar OpenSSL en Linux
Si usas Linux, es probable que ya tengas OpenSSL en tu equipo. Sin embargo, si aún no lo tienes, puedes instalarlo con tu administrador de paquetes. El siguiente comando instala OpenSSL en distribuciones basadas en Debian y Ubuntu:
Si no sabes si ya tienes OpenSSL instalado en tu equipo, puedes comprobarlo ejecutando el siguiente comando:
Si lo tienes, aparecerá el número de versión. Pero si después de ejecutar el comando anterior recibes un error que indica que el comando no se reconoce, tendrás que instalarlo.
Crear la clave privada
Podemos crear la clave privada con o sin una frase de contraseña de protección. Para agregar una frase de contraseña, simplemente usamos un cifrado en el comando, como -aes256.
Las dos opciones siguientes generan una clave privada RSA de 2048 bits, pero la primera genera la clave sin una frase de contraseña.
Crear la CSR con la clave
En este paso, usamos la clave privada generada en el paso anterior para generar una CSR. Para hacerlo, ejecuta el siguiente comando:
Debes ingresar información adicional sobre el certificado en la línea de comandos. Proporciónala y presiona Enter cuando termines.
Firmar el certificado con la clave
El último paso es firmar la solicitud para crear el certificado. Ejecuta el siguiente comando:
Aquí firmamos la solicitud del certificado con la misma clave que usamos para crearla. Por eso se llama certificado «autofirmado».
Puedes ver los detalles del certificado ejecutando el siguiente comando:
Ejecutar un servidor HTTPS de Python con TLS/SSL
Ahora que generamos correctamente un certificado autofirmado, lo usaremos para crear un servidor HTTPS que emplee cifrado TLS en toda su comunicación con un cliente.
El siguiente programa de Python inicia un servidor HTTPS en localhost, en el puerto 443.
En el código anterior, importamos los módulos ssl y http.server modules. Luego, llamamos al método HTTPServer en http.server y le pasamos la dirección y el número de puerto del servidor. Después, protegimos el socket con SSL al especificar la ruta a nuestro certificado en el método wrap_socket. Por último, ejecutamos el servidor al final del archivo.
Para conectar un cliente, puedes usar el módulo requests de Python para enviar una solicitud GET a la dirección del servidor:
Ten en cuenta que el código anterior debe agregarse a un archivo distinto del código del servidor. Al ejecutarlo, el cliente debería conectarse al servidor y devolver el mensaje [200] (OK):
Resumen
En este artículo, aprendimos sobre TLS/SSL y la importancia de tener un certificado digital válido en nuestros sitios web. También vimos cómo verificar SSL en un sitio web mediante el método requests.get.
Después, presentamos la biblioteca SSL de Python y recorrimos el proceso de crear y usar un servidor web de Python protegido con TLS/SSL. Generamos un certificado autofirmado con OpenSSL y lo agregamos a nuestra conexión de socket HTTP antes de ejecutar el servidor.
A medida que aumenta el volumen de transacciones en línea, el ciberdelito seguirá creciendo en escala y complejidad. Usar certificados SSL en nuestros sitios web no solo frena la mayoría de los intentos de hackearlos, sino que también ayuda a que los visitantes confíen más en ellos. Consulta este artículo para obtener más información sobre por qué deberías usar HTTPS.
