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.
iohNativeTLS es un valor de IOHandler. Sustituye a OpenSSL para las conexiones de un componente: TLS, QUIC y DTLS. Consulte TLS Nativo.
sgcCryptoBackend es un interruptor en tiempo de ejecución. Selecciona el backend de la criptografía de aplicación, todo lo que no es una conexión: hashes, firmas, acuerdo de claves y gestión de certificados.
Una aplicación que no necesita OpenSSL ni para sus conexiones ni para el resto de su criptografía utiliza ambos.
La unidad sgcBase_Helpers declara la variable global sgcCryptoBackend de tipo TsgcCryptoBackend:
cbOpenSSL (predeterminado): la criptografía de aplicación se ejecuta sobre OpenSSL, como en versiones anteriores.
cbNative: se ejecuta sobre sgcCrypto y OpenSSL nunca se carga para ella.
cbAuto: se usa OpenSSL cuando puede cargarse, sgcCrypto cuando no. La comprobación se ejecuta una sola vez y el resultado se guarda en caché.
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.
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.
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.
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.