Eseguire senza OpenSSL

sgcWebSockets può funzionare senza alcuna libreria OpenSSL. Due impostazioni indipendenti lo rendono possibile, ed entrambe sono basate sulle unit in puro Pascal sgcCrypto, disponibili a partire dall'edizione Standard.

Un'applicazione che non ha bisogno di OpenSSL né per le connessioni né per il resto della crittografia usa entrambe.

1. Interruttore in tempo di esecuzione: sgcCryptoBackend

La unit sgcBase_Helpers dichiara la variabile globale sgcCryptoBackend di tipo TsgcCryptoBackend:

L'interruttore è globale, non per componente. Impostarlo una sola volta all'avvio, prima che venga creato qualsiasi componente. sgcUseNativeCrypto restituisce True quando è in uso il backend nativo. Il backend nativo richiede che le unit sgcCrypto siano compilate (SGC_CRYPTO). Senza di esse, cbNative genera l'eccezione "Native crypto not available, sgcCrypto units are not compiled in". Chiamare sgcCheckNativeCrypto per ottenere quell'errore all'avvio invece che al primo utilizzo.

uses
  sgcBase_Helpers;

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

Queste parti seguono l'interruttore:

Area Cosa funziona nativamente
Funzioni hash e HMAC Le funzioni hash e HMAC di sgcBase_Helpers, e sgcEncryptString / sgcDecryptString.
Firme JWT, JWS Firma e verifica HMAC, RSA, RSA-PSS, ECDSA ed EdDSA (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey funziona solo su una chiave OpenSSL e genera un'eccezione sul backend nativo.
Certificati Gli helper sgcSSL: conversione PEM e DER, caricamento dei certificati, URI CRL e verifica della catena di certificati.
OAuth2 e DPoP L'helper JWK di OAuth2, e la verifica della prova DPoP del server OAuth2 (ES256, ES384, ES512, RS256, RS384, RS512). Vedere DPoP.
Amazon AWS Signature V4, l'URL firmato CloudFront, e l'autenticazione Signature V4 del client MQTT Amazon IoT, il cui SignatureV4.OpenSSL_Options viene quindi ignorato.
Web Push Il token VAPID ES256, il key agreement ECDH, HKDF e la cifratura del payload AES-128-GCM. Solo una connessione https al servizio push carica una libreria TLS, tramite il proprio IOHandler.
E2EE Key agreement, AES-GCM e il generatore casuale. Le chiavi pubbliche viaggiano sulla rete come PEM su entrambi i backend, le chiavi grezze sono comunque accettate, quindi i peer su backend diversi interoperano.
WebAuthn, SAML, OIDC Il certificato WebAuthn, la chiave COSE e i controlli di attestazione, e la verifica della firma XMLDSig usata da SAML e OIDC.
NTLM Il codice MD4 e DES dell'autenticazione NTLM. È nativo in ogni build e non richiede più alcuna define.
AEAD, KEM, HKDF sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 ed ECDH P-256) e sgcSSL_HKDF (ora anche con sgcHKDF_MD_SHA384). ML-KEM-768 non richiede OpenSSL 3.5, e le chiavi usano le stesse codifiche di OpenSSL 3.5. In una build FIPS ChaCha20-Poly1305 non è disponibile e genera un'eccezione.
QUIC, DTLS, SRTP La protezione dei pacchetti QUIC, il certificato DTLS e SRTP. Con iohNativeTLS sono già nativi per connessione, qualunque cosa dica l'interruttore.

sgcCryptoBackend non modifica la connessione TLS di un componente. Un componente che mantiene IOHandler = iohOpenSSL continua a caricare OpenSSL quando si connette.

2. Define opzionale: SGC_NATIVE_CRYPTO

La define è disattivata per impostazione predefinita e non è più necessaria per funzionare senza OpenSSL. Senza di essa, viene compilato sia il codice OpenSSL sia quello nativo e sgcCryptoBackend decide in tempo di esecuzione. Con essa, il backend nativo viene forzato indipendentemente da ciò che dice sgcCryptoBackend, e il codice OpenSSL viene rimosso dalle unit di crittografia applicativa, quindi l'eseguibile risulta più piccolo. Per abilitarla, aprire sgcVer.inc e rimuovere il punto dalla riga

{.$DEFINE SGC_NATIVE_CRYPTO}

oppure aggiungere SGC_NATIVE_CRYPTO alle define condizionali del progetto. SGC_NATIVE_CRYPTO attiva anche SGC_CRYPTO, le unit sgcCrypto di cui ha bisogno. DISABLE_SGC_NATIVE_CRYPTO la disattiva di nuovo.

3. Zero OpenSSL a runtime

Le impostazioni necessarie dipendono da ciò che usa l'applicazione:

Area Impostazioni per non usare OpenSSL
TLS su TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT e gli altri protocolli TLSOptions.IOHandler (client) o SSLOptions.IOHandler (server) = iohNativeTLS. Vedere TLS nativo.
QUIC e HTTP/3 IOHandler = iohNativeTLS. L'handshake, la protezione dei pacchetti, l'aggiornamento delle chiavi e il tag Retry sono tutti nativi. Vedere QUIC e HTTP/3.
DTLS e WebRTC DTLSOptions.IOHandler = iohNativeTLS. L'handshake, il certificato DTLS e le chiavi SRTP sono nativi. Vedere DTLSOptions e WebRTC DTLS.
Crittografia applicativa: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML e le altre aree della prima tabella sgcCryptoBackend := cbNative all'avvio, oppure la define SGC_NATIVE_CRYPTO.

Le righe con iohNativeTLS non richiedono alcuna define né alcuna impostazione di sgcCryptoBackend. Selezionare iohNativeTLS in una build priva delle unit sgcCrypto genera un'eccezione, non ripiega mai silenziosamente su OpenSSL.

iohNativeTLS

Con iohNativeTLS l'handshake TLS 1.3 e TLS 1.2 e il livello dei record funzionano sul motore nativo. Funziona per i client e server WebSocket, HTTP/1, HTTP/2 e TCP, e per tutto ciò che è costruito su di essi: MQTT, AMQP, STOMP e gli altri protocolli, i componenti API, i client IoT (Certificate.IOHandler), la connessione upstream del server proxy (Proxy.TLSOptions) e il client LDAP. Il certificato può essere PEM, DER o un file .pfx / .p12.