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.
iohNativeTLS è un valore di IOHandler. Sostituisce OpenSSL per le connessioni di un componente: TLS, QUIC e DTLS. Vedere TLS nativo.
sgcCryptoBackend è un interruttore in tempo di esecuzione. Seleziona il backend della crittografia applicativa, tutto ciò che non è una connessione: hash, firme, key agreement e gestione dei certificati.
Un'applicazione che non ha bisogno di OpenSSL né per le connessioni né per il resto della crittografia usa entrambe.
La unit sgcBase_Helpers dichiara la variabile globale sgcCryptoBackend di tipo TsgcCryptoBackend:
cbOpenSSL (predefinito): la crittografia applicativa funziona su OpenSSL, come nelle versioni precedenti.
cbNative: funziona su sgcCrypto e OpenSSL non viene mai caricato per essa.
cbAuto: OpenSSL viene usato quando può essere caricato, sgcCrypto quando non può. Il controllo viene eseguito una sola volta e il risultato viene memorizzato nella cache.
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.
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.
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.
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.