Ejecutar sin OpenSSL

sgcWebSockets puede ejecutarse sin ninguna biblioteca OpenSSL en absoluto. Dos ajustes independientes lo hacen posible, y ambos se apoyan en las unidades sgcCrypto en Pascal puro, que se incluyen a partir de la edición Standard.

Una aplicación que no necesita OpenSSL ni para sus conexiones ni para el resto de su criptografía utiliza ambos.

1. Interruptor en tiempo de ejecución: sgcCryptoBackend

La unidad sgcBase_Helpers declara la variable global sgcCryptoBackend de tipo TsgcCryptoBackend:

El interruptor es global, no por componente. Establézcalo una sola vez al iniciar, antes de crear cualquier componente. sgcUseNativeCrypto devuelve True cuando el backend nativo está en uso. El backend nativo necesita las unidades sgcCrypto compiladas (SGC_CRYPTO). Sin ellas, cbNative genera la excepción "Native crypto not available, sgcCrypto units are not compiled in". Llame a sgcCheckNativeCrypto para obtener ese error al iniciar, en lugar de en el primer uso.

uses
  sgcBase_Helpers;

begin
  sgcCryptoBackend := cbNative;
  sgcCheckNativeCrypto;
  Application.Initialize;
  ...

Estas partes siguen el interruptor:

Área Qué se ejecuta de forma nativa
Funciones de hash y HMAC Las funciones de hash y HMAC de sgcBase_Helpers, y sgcEncryptString / sgcDecryptString.
Firmas JWT, JWS HMAC, RSA, RSA-PSS, ECDSA y EdDSA, firma y verificación (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey solo funciona con una clave de OpenSSL y genera un error en el backend nativo.
Certificados Los ayudantes sgcSSL: conversión PEM y DER, carga de certificados, URI de CRL y verificación de la cadena de certificados.
OAuth2 y DPoP El ayudante JWK de OAuth2, y la comprobación de la prueba DPoP del servidor OAuth2 (ES256, ES384, ES512, RS256, RS384, RS512). Consulte DPoP.
Amazon AWS Signature V4, la URL firmada de CloudFront, y la autenticación Signature V4 del cliente MQTT de Amazon IoT, cuyas SignatureV4.OpenSSL_Options se ignoran entonces.
Web Push El token VAPID ES256, el acuerdo de claves ECDH, HKDF y el cifrado de carga útil AES-128-GCM. Solo una conexión https al servicio push carga una biblioteca TLS, a través de su IOHandler.
E2EE Acuerdo de claves, AES-GCM y el generador aleatorio. Las claves públicas viajan por la red como PEM en ambos backends, las claves en bruto también se aceptan, de modo que los peers en distintos backends interoperan.
WebAuthn, SAML, OIDC Las comprobaciones de certificado, clave COSE y attestation de WebAuthn, y la comprobación de firma XMLDSig usada por SAML y OIDC.
NTLM El código MD4 y DES de la autenticación NTLM. Es nativo en todas las compilaciones y ya no necesita ninguna definición.
AEAD, KEM, HKDF sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 y ECDH P-256) y sgcSSL_HKDF (ahora también con sgcHKDF_MD_SHA384). ML-KEM-768 no necesita OpenSSL 3.5, y las claves usan las mismas codificaciones que OpenSSL 3.5. En una compilación FIPS, ChaCha20-Poly1305 no está disponible y genera un error.
QUIC, DTLS, SRTP La protección de paquetes de QUIC, el certificado DTLS y SRTP. Con iohNativeTLS ya son nativos por conexión, sea cual sea lo que diga el interruptor.

sgcCryptoBackend no cambia la conexión TLS de un componente. Un componente que conserva IOHandler = iohOpenSSL sigue cargando OpenSSL al conectarse.

2. Definición opcional: SGC_NATIVE_CRYPTO

La definición está desactivada de forma predeterminada y ya no es necesaria para ejecutar sin OpenSSL. Sin ella, se compilan tanto el código de OpenSSL como el código nativo, y sgcCryptoBackend decide en tiempo de ejecución. Con ella, el backend nativo se fuerza sea cual sea lo que diga sgcCryptoBackend, y el código de OpenSSL se elimina de las unidades de criptografía de aplicación, de modo que el ejecutable es más pequeño. Para activarla, abra sgcVer.inc y elimine el punto de la línea

{.$DEFINE SGC_NATIVE_CRYPTO}

o añada SGC_NATIVE_CRYPTO a las definiciones condicionales de su proyecto. SGC_NATIVE_CRYPTO también activa SGC_CRYPTO, las unidades sgcCrypto que necesita. DISABLE_SGC_NATIVE_CRYPTO la desactiva de nuevo.

3. Cero OpenSSL en tiempo de ejecución

Los ajustes que necesita dependen de lo que use la aplicación:

Área Ajustes para no usar OpenSSL
TLS sobre TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT y los demás protocolos TLSOptions.IOHandler (cliente) o SSLOptions.IOHandler (servidor) = iohNativeTLS. Consulte TLS Nativo.
QUIC y HTTP/3 IOHandler = iohNativeTLS. El protocolo de enlace, la protección de paquetes, la actualización de claves y el sello Retry son todos nativos. Consulte QUIC y HTTP/3.
DTLS y WebRTC DTLSOptions.IOHandler = iohNativeTLS. El protocolo de enlace, el certificado DTLS y las claves SRTP son nativos. Consulte DTLSOptions y WebRTC DTLS.
Criptografía de aplicación: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML y las demás áreas de la primera tabla sgcCryptoBackend := cbNative al iniciar, o la definición SGC_NATIVE_CRYPTO.

Las filas de iohNativeTLS no necesitan ninguna definición ni ningún ajuste de sgcCryptoBackend. Seleccionar iohNativeTLS en una compilación sin las unidades sgcCrypto genera una excepción, nunca recurre a OpenSSL en silencio.

iohNativeTLS

Con iohNativeTLS el protocolo de enlace de TLS 1.3 y TLS 1.2 y la capa de registro se ejecutan sobre el motor nativo. Funciona para los clientes y servidores WebSocket, HTTP/1, HTTP/2 y TCP, y para todo lo construido sobre ellos: MQTT, AMQP, STOMP y los demás protocolos, los componentes de API, los clientes IoT (Certificate.IOHandler), la conexión ascendente del servidor proxy (Proxy.TLSOptions) y el cliente LDAP. El certificado puede ser PEM, DER o un archivo .pfx / .p12.