Introducción a OpenSSL: conceptos básicos de criptografía
Este artículo es el primero de dos artículos que cubren los conceptos básicos de la criptografía utilizando OpenSSL, una biblioteca y un conjunto de herramientas populares de nivel de producción en Linux y otros sistemas. (Para instalar la última versión de OpenSSL, consulte aquí). Las utilidades de OpenSSL están disponibles desde la línea de comandos y los programas también pueden llamar a funciones en la biblioteca OpenSSL. El programa de muestra de este artículo utiliza C, el lenguaje fuente de la biblioteca OpenSSL.
Esta serie de dos partes cubre hashes criptográficos, firmas digitales, cifrado y descifrado y certificados digitales. Puede encontrar el código y los ejemplos de línea de comando en un archivo ZIP en mi sitio web.
Primero revisemos el SSL en el nombre OpenSSL.
Secure Socket Layer (SSL) es un protocolo de cifrado lanzado por Netscape en 1995. Esta capa de protocolo puede ubicarse encima de HTTP, proporcionando seguridad S: para HTTPS. El protocolo SSL proporciona una variedad de servicios de seguridad, incluidos dos que son cruciales en HTTPS:
SSL tiene múltiples versiones (como SSLv2 y SSLv3), y en 1999 apareció una versión basada en SSLv3. Un protocolo similar a Seguridad de la capa de transporte (TLS). TLSv1 y SSLv3 son similares, pero no lo suficientemente potentes como para funcionar entre sí. Sin embargo, a menudo se hace referencia a SSL/TLS como el mismo protocolo. Por ejemplo, las funciones OpenSSL suelen incluir SSL en el nombre, incluso si se utiliza TLS (en lugar de SSL). Además, la llamada a la utilidad de línea de comandos OpenSSL comienza con openssl.
La documentación de OpenSSL está dispersa excepto las páginas de manual, que son difíciles de encontrar y utilizar dado el tamaño del kit de herramientas de OpenSSL. Los ejemplos de código y línea de comando reúnen los temas principales. Comencemos con un ejemplo familiar (acceder a un sitio web usando HTTPS) y usemos ese ejemplo para seleccionar las partes del cifrado que nos interesan.
El programa cliente que se muestra aquí se conecta a Google a través de HTTPS:
Este programa se puede compilar y ejecutar desde la línea de comandos (tenga en cuenta la L minúscula en -lssl y -lcrypto):
Este programa intenta abrir una conexión segura al sitio web www.google.com. Durante el protocolo de enlace TLS con el servidor web de Google, el programa cliente recibe uno o más certificados digitales, que el programa cliente intenta validar (pero falló en mi sistema). A pesar de ello, el programa cliente sigue obteniendo la página de inicio de Google a través del canal seguro. Este programa depende de los artefactos de seguridad mencionados anteriormente, aunque en el código anterior solo se resaltan los certificados digitales. Pero otros artefactos todavía están funcionando detrás de escena, y se explicarán en detalle más adelante.
Normalmente, un programa cliente en C o C que abre un canal HTTP (no seguro) utilizará estructuras como descriptores de archivos o sockets de red, que son dos procesos (por ejemplo, este cliente El punto final para la conexión entre el programa y el servidor web de Google). Un descriptor de archivo, por otro lado, es un valor entero no negativo que es una estructura utilizada dentro de un programa para identificar cualquier clase de archivo abierta por ese programa. Un programa de este tipo también utilizaría una estructura para especificar detalles sobre la dirección del servidor web.
Estas estructuras de nivel relativamente bajo no aparecen en los programas cliente porque la biblioteca OpenSSL encapsula elementos como la infraestructura de socket y las especificaciones de dirección en estructuras de seguridad de nivel superior. El resultado es una API simple. Primero veamos los detalles de seguridad en el ejemplo del programa cliente.
Durante el protocolo de enlace con el servidor web, el programa cliente recibe uno o más certificados digitales para autenticar la identidad del servidor. Sin embargo, el programa cliente no envía su propio certificado, lo que significa que esta autenticación es unidireccional. (Los servidores web normalmente están configurados para no requerir certificados de cliente). Aunque la verificación del certificado del servidor web falló, el programa cliente continuó obteniendo la página de inicio de Google a través del canal seguro conectado al servidor web.
¿Por qué fallan los intentos de verificar los certificados de Google? Un directorio de instalación típico de OpenSSL es /etc/ssl/certs, que contiene el archivo ca-certificates.crt. Este directorio y archivo contienen el certificado digital que viene con OpenSSL, formando un almacén de confianza. El almacén de confianza se puede actualizar según sea necesario y, en particular, puede incluir certificados recientemente confiables y eliminar certificados en los que ya no se confía.
El programa cliente recibió tres certificados del servidor web de Google, pero el almacén de confianza OpenSSL de mi computadora no contiene una coincidencia exacta. Tal como está escrito actualmente, el programa cliente no resuelve este problema, por ejemplo, verificando la firma digital en el certificado de Google (una firma utilizada para certificar el certificado). Si la firma es confiable, también se debe confiar en el certificado que contiene la firma. A pesar de esto, el programa cliente continúa buscando la página y luego imprime la página de inicio de Google. Estos se tratan con más detalle en la siguiente sección.
Comencemos con el artefacto de seguridad visible en el ejemplo del cliente (el certificado digital) y luego consideremos cómo se relacionan otros artefactos de seguridad con él. El principal formato estándar para los certificados digitales es X509, y los certificados de nivel de producción los emite una autoridad certificadora (CA), como Verisign.
Un certificado digital contiene diversa información (como fechas de activación y vencimiento y el nombre de dominio del propietario), así como la identidad del emisor y la firma digital (que es un hash criptográfico cifrado). El certificado también tiene un valor hash no cifrado que se utiliza como huella digital de identificación.
El valor hash proviene de asignar un número arbitrario de bits binarios a un resumen de longitud fija. No importa lo que representen los bits (un informe contable, una novela o una película digital). Por ejemplo, el algoritmo hash Message Digest versión 5 (MD5) asigna bits de entrada de longitud arbitraria a un valor hash de 128 bits, mientras que el algoritmo SHA1 (Secure Hash Algorithm versión 1) asigna bits de entrada a valores hash de 160 bits. Diferentes bits de entrada dan como resultado valores hash diferentes (en realidad, estadísticamente únicos). El próximo artículo entrará en más detalles y se centrará en lo que hace que una función hash sea criptográficamente útil.
Existen diferentes tipos de certificados digitales (como certificados raíz, certificados intermedios y certificados de entidad final) y se forma una jerarquía que refleja estos tipos de certificados. Como sugiere el nombre, el certificado raíz está en la parte superior de la jerarquía y los certificados debajo de él heredan la confianza que tiene el certificado raíz. La biblioteca OpenSSL y la mayoría de los lenguajes de programación modernos tienen tipos de datos X509 y funciones para manejar dichos certificados. El certificado de Google está en formato X509 y el programa cliente comprueba si es X509_V_OK.
Los certificados X509 se basan en una infraestructura de clave pública (PKI), que incluye algoritmos (RSA es el algoritmo dominante) para generar pares de claves: pública* **Clave y su clave privada emparejada. Una clave pública es una identidad: la clave pública de Amazon la identifica y mi clave pública me identifica a mí. La clave privada será mantenida confidencial por su propietario.
Las claves que aparecen en pares tienen usos estándar. Un mensaje se puede cifrar utilizando la clave pública y luego descifrarlo utilizando la clave privada del mismo par de claves. También se puede utilizar una clave privada para firmar un documento u otro artefacto electrónico (como un programa o un correo electrónico) y luego se puede verificar la firma utilizando la clave pública del par. Los dos ejemplos siguientes añaden algunos detalles.
En el primer ejemplo, Alice distribuye su clave pública al mundo, incluido Bob. Luego, Bob cifra el correo electrónico con la clave pública de Alice y envía el correo electrónico cifrado a Alice. Un mensaje cifrado con la clave pública de Alice se podrá descifrar con su clave privada (se supone que es su propia clave privada), de la siguiente manera:
Es teóricamente posible descifrar el mensaje sin la clave privada de Alice, pero en situaciones reales Esto es computacionalmente imposible utilizando un sistema de par de claves de cifrado como RSA.
Ahora, para el segundo ejemplo, firme el documento para demostrar su autenticidad. El algoritmo de firma utiliza la clave privada de un par de claves para procesar un hash criptográfico del documento que se está firmando:
Supongamos que Alice firma digitalmente un contrato enviado a Bob. Luego, Bob puede verificar la firma utilizando la clave pública del par de claves de Alice:
La firma de Alice no se puede falsificar fácilmente sin la clave privada de Alice: por lo tanto, es necesario que Alice mantenga su clave privada en secreto.
En el programa cliente, ninguna de estas características de seguridad se demuestra explícitamente excepto los certificados digitales. El siguiente artículo proporciona más detalles con ejemplos que utilizan utilidades y funciones de biblioteca de OpenSSL.
Mientras tanto, echemos un vistazo a las utilidades de línea de comandos de OpenSSL: específicamente las que verifican el certificado del servidor web durante el protocolo de enlace TLS. Se puede llamar a la utilidad OpenSSL usando el comando openssl, seguido de agregar una combinación de parámetros e indicadores para especificar la operación deseada.
Eche un vistazo al siguiente comando:
El resultado es una lista de algoritmos relacionados que componen un conjunto de cifrado(). Aquí está el comienzo de la lista, con comentarios para aclarar las siglas:
El siguiente comando, usando el parámetro s_client, abrirá una conexión segura a www.google.com y mostrará información sobre esta conexión en la pantalla. Toda la información:
Los sitios web importantes como Google suelen enviar varios certificados para la autenticación.
El resultado finaliza con información resumida sobre la sesión TLS, incluidos detalles del conjunto de algoritmos de cifrado:
El protocolo TLS 1.2 se utiliza en el programa cliente y el ID de sesión identifica de forma única el Utilidad openssl La conexión entre el programa y los servidores web de Google. Las entradas cifradas se pueden analizar de la siguiente manera:
El conjunto de algoritmos de cifrado evoluciona constantemente. Por ejemplo, no hace mucho tiempo, Google utilizó el algoritmo de cifrado de flujo RC4 (versión 4 de Ron's Cipher desarrollado posteriormente por Ron Rivest de RSA). RC4 ahora tiene vulnerabilidades conocidas, que presumiblemente llevaron parcialmente al cambio de Google a AES128.
Nuestro primer vistazo a OpenSSL a través de un cliente web C seguro y varios ejemplos de línea de comandos pusieron de relieve algunos temas que necesitaban mayor aclaración. El próximo artículo entrará en más detalles, comenzando con los hashes criptográficos y terminando con una discusión más completa sobre cómo los certificados digitales abordan los desafíos de distribución de claves.
vía: /article/19/6/cryptography-basics-openssl-part-1
Autor: Marty Kalin Selección de tema: lujun9972 Traductor: wxy Corrector: wxy