Arquitectura estratégica de OpenSSL

En este documento, el Comité de Gestión de OpenSSL describe los principios básicos de la arquitectura estratégica de OpenSSL. A partir de 3.0.0, se requerirán varias versiones para pasar de la arquitectura actual (versión 1.1.1) al futuro.

Se esperan numerosos cambios en la arquitectura. Ofrecemos una posible ruta de migración. El lanzamiento de OpenSSL 3.0.0 afecta mínimamente a la gran mayoría de las aplicaciones existentes, casi todas las aplicaciones alfabetizadas solo tendrán que volver a compilarse.

La funcionalidad actual proporcionada por la interfaz del motor será reemplazada por la interfaz del software con el tiempo. OpenSSL 3.0.0 conservará el soporte del motor. La arquitectura futura se puede implementar completamente no antes de OpenSSL 4.0.0.

Arquitectura actual


OpenSSL actualmente tiene cuatro componentes principales:

  1. libcrypto. La biblioteca principal para proporcionar implementaciones de numerosas primitivas criptográficas. Además, proporciona un conjunto de servicios de soporte para libssl y libcrypto, así como implementaciones de protocolos como CMS y OCSP.
  2. El motor La funcionalidad de libcrypto se puede ampliar a través de la API del motor.

    Por lo general, los motores son módulos cargados dinámicamente registrados en libcrypto y que utilizan ganchos disponibles para implementar algoritmos criptográficos, implementaciones alternativas de algoritmos ya proporcionados por libcrypto (por ejemplo, con soporte de aceleración de hardware), pero también pueden incluir algoritmos que no son implementados en OpenSSL por por defecto (por ejemplo, el mecanismo GOST implementa la familia rusa de algoritmos GOST). Algunos motores vienen con la distribución OpenSSL, mientras que otros vienen con terceros (nuevamente, GOST).
  3. libssl. Una biblioteca que depende de libcrypto e implementa los protocolos TLS y DTLS.
  4. Aplicaciones Un conjunto de herramientas de línea de comandos que utilizan los componentes básicos de libssl y libcrypto para proporcionar un conjunto de funciones criptográficas y de otro tipo, como:

    • Generación y verificación de claves y parámetros.
    • Generación y verificación de certificados.
    • Herramientas de prueba SSL / TLS
    • Verificación ASN.1
    • y otros

    OpenSSL actualmente tiene las siguientes características:

    1. EVP La API de capa EVP (envolvente) proporciona una interfaz abstracta de alto nivel para la funcionalidad criptográfica, sin estar vinculada a una implementación específica. No se recomienda el uso directo de implementaciones específicas de algoritmos criptográficos que omiten las interfaces EVP. También proporciona operaciones compuestas como la firma y la verificación. Algunas operaciones compuestas también se proporcionan como una operación de nivel EVP (por ejemplo, HMAC-SHA256). EVP también permite el uso de algoritmos criptográficos de una manera algorítmica-agnóstica (por ejemplo, EVP_DigestSign funciona para los algoritmos RSA y ECDSA).
    2. FIPS140 no es compatible, solo está disponible en OpenSSL-1.0.2, que es anterior a la arquitectura actual y no es compatible con API o ABI.

    Concepto de componente


    La arquitectura existente es una estructura simple de cuatro niveles con una capa de cifrado en la parte inferior. La capa TLS depende de la capa criptográfica, y las aplicaciones dependen tanto de la capa TLS como de la capa criptográfica.

    Nota: la presencia de un componente en el diagrama no significa que el componente sea una API pública o que esté destinado al acceso / uso directo del usuario final.



    Diagrama de paquete


    Los componentes descritos anteriormente están empaquetados en bibliotecas (libcrypto y libssl) y las interfaces del kernel correspondientes, así como en la línea de comandos ejecutable (openssl) para iniciar varias aplicaciones. Esto se muestra en el siguiente diagrama.



    Arquitectura futura


    Características de la arquitectura futura:

    • Los servicios del kernel forman los componentes básicos utilizados por las aplicaciones y los proveedores (por ejemplo, BIO, X509, SECMEM, ASN1, etc.).
    • Los proveedores utilizan algoritmos criptográficos y servicios de soporte. Un proveedor implementa una o más de las siguientes funciones:

      • Primitivas criptográficas para el algoritmo: cifrado, descifrado, firma, hash, etc.
      • Serialización para el algoritmo, por ejemplo, la función de convertir la clave privada en un archivo PEM. La serialización puede ser en formatos o desde formatos que actualmente no son compatibles.
      • Tienda de backend del cargador. OpenSSL actualmente se entrega con un gestor de arranque para leer claves, parámetros y otros elementos de los archivos. Los proveedores pueden implementar descargadores para leer datos de otros lugares (por ejemplo, desde un directorio LDAP).

      El proveedor puede ser totalmente autónomo o usar servicios proporcionados por diferentes proveedores o servicios del núcleo. Por ejemplo, una aplicación puede usar primitivas criptográficas para un algoritmo implementado por un proveedor de aceleradores de hardware, pero usar los servicios de serialización de otro proveedor para exportar claves al formato PKCS # 12.

      El proveedor predeterminado (que contiene el núcleo de las implementaciones actuales del algoritmo criptográfico OpenSSL) estará "incorporado", pero otros proveedores podrán cargar dinámicamente en tiempo de ejecución.

      Los módulos de proveedores heredados proporcionarán implementaciones criptográficas para algoritmos más antiguos (por ejemplo, DES, MDC2, MD2, Blowfish, CAST). Publicaremos reglas sobre cómo y cuándo los algoritmos pasan de un proveedor predeterminado a un proveedor obsoleto.

      El proveedor FIPS que implementa el módulo criptográfico OpenSSL FIPS puede cargar dinámicamente en tiempo de ejecución.
    • El núcleo proporciona acceso a los servicios ofrecidos por los proveedores de aplicaciones (y otros). Los vendedores le dan acceso al núcleo a los métodos. Un núcleo es un mecanismo por el cual se descubren implementaciones específicas de cosas como algoritmos.

      El núcleo implementa una función de búsqueda basada en propiedades para encontrar algoritmos. Por ejemplo, esto encontrará un algoritmo donde "fips = true" o "keysize = 128, constant_time = true". Los detalles se publicarán en documentos posteriores del proyecto.
    • Implementaciones de protocolos como TLS, DTLS.

    La arquitectura futura tiene las siguientes características:

    • La capa EVP se convierte en una envoltura delgada para servicios implementados a través de proveedores. La mayoría de las llamadas se procesan con un mínimo de procesamiento previo, procesamiento posterior o sin procesamiento.
    • Aparecerán nuevas API EVP para buscar en el núcleo la implementación del algoritmo que se utilizará para cualquier llamada EVP.
    • La información se transferirá entre la biblioteca principal y los proveedores de la misma manera, independientemente de su implementación.
    • Las API obsoletas (como las API criptográficas de bajo nivel que no pasan a través de la capa EVP) serán excluidas. Tenga en cuenta que hay API desactualizadas para algoritmos que no están desactualizados (por ejemplo, AES no es un algoritmo desactualizado, pero AES_encrypt es una API desactualizada).
    • El módulo criptográfico OpenSSL FIPS se implementará como un proveedor cargado dinámicamente. Será autónomo (es decir, puede depender solo de las bibliotecas de tiempo de ejecución del sistema y los servicios proporcionados por el núcleo).
    • Otras interfaces también se pueden convertir para usar el núcleo a lo largo del tiempo (por ejemplo, OSSL_STORE).
    • Usar el motor va a los proveedores. "Adiós, ingenieros, hola, proveedores" .

    Concepto de componente


    El siguiente diagrama proporciona una descripción general de los componentes de la futura arquitectura OpenSSL.

    Nota: la presencia de un componente en el diagrama no significa que el componente sea una API pública o que esté destinado al acceso / uso directo del usuario final.



    Los siguientes componentes se muestran aquí:

    • Aplicaciones: utilidades de línea de comandos: ca, cifrados, cms, dgst, etc.
    • Protocolos: el componente proporciona la capacidad de comunicarse entre puntos finales utilizando protocolos estándar:
      • Protocolos TLS: implementación de todos los protocolos TLS / DTLS compatibles y la infraestructura de servicio:
        • SSL BIO: BIO para la comunicación TLS
        • Statem: máquina de estado TLS
        • Grabar: TLS Record Layer
      • Otros protocolos
        • CMS: Implementación del estándar de sintaxis de mensajes criptográficos
        • OCSP: implementación del protocolo de estado del certificado en línea
        • TS: Implementación del protocolo de marca de tiempo
      • Servicios de soporte: componentes diseñados específicamente para admitir la implementación de código de protocolo
        • Paquete: componente interno para leer mensajes de protocolo
        • Wpacket: un componente interno para grabar mensajes de protocolo
    • Kernel: este es el componente fundamental que conecta las solicitudes de servicio (por ejemplo, cifrado) con el proveedor de servicios. Permite a los proveedores registrar sus servicios junto con sus propiedades. El kernel también proporciona la capacidad de encontrar un servicio con un conjunto de propiedades que el servicio debería ejecutar. Por ejemplo, las propiedades del servicio de cifrado pueden incluir "aead", "aes-gcm", "fips", "security-bits = 128", y así sucesivamente.
    • Proveedor predeterminado: implementa un conjunto de servicios predeterminados registrados en el núcleo.
      • Servicios de soporte
        • Implementaciones de bajo nivel: este es un conjunto de componentes que realmente implementan primitivas criptográficas.
    • Proveedor FIPS: implementa un conjunto de servicios que están verificados y disponibles para el núcleo de FIPS. Incluye los siguientes servicios de soporte:
      • POST: Prueba de encendido automático
      • KAT: Pruebas de respuestas conocidas
      • Control de integridad
      • Implementaciones de bajo nivel: este es un conjunto de componentes que realmente implementan primitivas criptográficas (para satisfacer el requisito de FIPS independiente).
    • Proveedor de algoritmos heredados: proporciona implementaciones de algoritmos heredados que se proporcionarán a través de la API EVP.
    • Proveedor externo: no forma parte de la distribución de OpenSSL. Los terceros pueden vender sus propios proveedores.
    • Servicios generales: forman los componentes básicos utilizados por aplicaciones y proveedores (por ejemplo, BIO, X509, SECMEM, ASN1, etc.).
    • API obsoletas. API de "bajo nivel": aquí la palabra "obsoleto" se refiere específicamente a la API, y no al algoritmo en sí. Por ejemplo, AES no es un algoritmo desactualizado, pero hay API desactualizadas para él (por ejemplo, AES_encrypt).

    Diagrama de paquete


    Los diversos componentes descritos anteriormente en el diagrama conceptual de los componentes están físicamente empaquetados en:

    • Aplicaciones ejecutables para usuarios
    • Biblioteca (s) para aplicaciones
    • Módulos cargables dinámicamente para el núcleo.




    Los siguientes paquetes reales se muestran aquí:

    • El archivo ejecutable es OpenSSL. Aplicación de línea de comando.
    • Libssl. Contiene todo lo que está directamente relacionado con TLS y DTLS. Su contenido es muy similar al del libssl actual. Tenga en cuenta que algunos servicios de soporte se moverán a libcrypto.
    • Libcrypto Esta biblioteca contiene los siguientes componentes:
      • Implementaciones de los principales servicios: X509, ASN1, EVP, OSSL_STORE, etc.
      • El núcleo
      • Protocolos no TLS o DTLS
      • Servicios de soporte de protocolo (p. Ej., Paquetes y paquetes)
      • Proveedor predeterminado que contiene implementaciones de todos los algoritmos predeterminados
    • Libcrypto-legacy. Proporciona API heredadas de bajo nivel. La implementación de los algoritmos para estas API puede provenir de cualquier proveedor.
    • Módulo FIPS. Contiene un proveedor FIPS que implementa un conjunto de servicios verificados por FIPS y registrados en el núcleo.
    • Módulo heredado. Contiene un proveedor desactualizado.

Source: https://habr.com/ru/post/443844/


All Articles