Rimuovere le DLL OpenSSL da un'applicazione Delphi era una decisione di build. Attivavi una define del compilatore, ricompilavi e distribuivi un secondo eseguibile ai clienti che non potevano avere OpenSSL sulle loro macchine. sgcWebSockets 2026.10 la trasforma in una decisione a runtime: una variabile globale, impostata una volta all'avvio, sceglie se la crittografia dell'applicazione gira su OpenSSL oppure sulla crittografia integrata nella libreria, scritta in Object Pascal.
Il lato della connessione, il TLS senza OpenSSL, è trattato in Delphi TLS 1.3 senza DLL OpenSSL. Questo articolo riguarda tutto il resto: le firme, gli hash, l'accordo di chiave e la cifratura che la tua applicazione esegue al di fuori dell'handshake TLS.
Una riga all'avvio
L'unit sgcBase_Helpers dichiara la variabile globale sgcCryptoBackend, di tipo TsgcCryptoBackend:
uses
sgcBase_Helpers;
begin
sgcCryptoBackend := cbNative;
sgcCheckNativeCrypto;
Application.Initialize;
...
L'interruttore è globale, non per componente, quindi va impostato prima che venga creato qualsiasi componente. sgcCheckNativeCrypto è facoltativo: se le unit di crittografia nativa non sono compilate, solleva un'eccezione all'avvio con un messaggio chiaro invece che alla prima firma che la tua applicazione prova a generare.
Tre valori
cbOpenSSLè il valore predefinito. La crittografia dell'applicazione gira su OpenSSL, esattamente come nelle versioni precedenti, quindi l'aggiornamento non cambia nulla finché non imposti la variabile.cbNativeesegue la crittografia dell'applicazione sull'implementazione Object Pascal. OpenSSL non viene mai caricato per essa.cbAutousa OpenSSL quando le sue librerie possono essere caricate e il codice nativo quando non possono. Il controllo viene eseguito una sola volta e il risultato viene messo in cache.
cbAuto è la scelta giusta per i prodotti distribuiti in entrambi i modi. Alcuni clienti installano le librerie OpenSSL accanto all'eseguibile, ad altri non è permesso, e la stessa build funziona per entrambi senza generare un ticket di supporto per una DLL mancante.
// same executable, with or without the OpenSSL libraries beside it
sgcCryptoBackend := cbAuto;
Cosa segue l'interruttore
L'interruttore copre la crittografia che i componenti eseguono per tuo conto:
- gli helper di hashing e HMAC;
- la firma e la verifica JWT, HS, RS ed ES;
- le prove OAuth2 e DPoP;
- AWS Signature V4 e gli URL firmati CloudFront;
- Web Push;
- la crittografia end-to-end (E2EE), dove i peer su backend diversi interoperano, così un client su
cbNativeparla con un server ancora su OpenSSL; - WebAuthn e le passkey;
- SAML e le firme XML;
- NTLM;
- AEAD, ML-KEM e HKDF;
- la protezione dei pacchetti QUIC, i certificati DTLS e WebRTC e SRTP.
Nessuno di questi richiede una modifica al codice. Un JWT che ieri era firmato con OpenSSL oggi è firmato nativamente perché lo dice la variabile.
Le connessioni sono un'impostazione separata
sgcCryptoBackend non cambia il modo in cui un componente si connette. Il TLS di una connessione si sceglie per componente, con IOHandler = iohNativeTLS, sui componenti TCP, HTTP e WebSocket e su tutto ciò che è costruito su di essi, come MQTT, su QUIC e HTTP/3, e su DTLSOptions per WebRTC:
sgcCryptoBackend := cbNative; // application crypto
oClient.TLSOptions.IOHandler := iohNativeTLS; // this connection
Un componente che mantiene l'handler OpenSSL carica comunque OpenSSL quando si connette. Con iohNativeTLS su QUIC, HTTP/3 e DTLS, non viene usato alcun OpenSSL, qualunque cosa dica l'interruttore. Un'applicazione che non vuole OpenSSL da nessuna parte imposta entrambi: l'interruttore per la sua crittografia, e l'handler su ogni componente che apre una connessione sicura.
La define ora è facoltativa
Finora, funzionare senza OpenSSL richiedeva la define del compilatore SGC_NATIVE_CRYPTO. Non è più necessaria. Senza di essa, sia OpenSSL sia il codice nativo vengono compilati e la variabile decide a runtime.
La define ha ancora un uso. Forza il backend nativo qualunque cosa dica sgcCryptoBackend e rimuove il codice OpenSSL dalle unit di crittografia dell'applicazione, così l'eseguibile è più piccolo. Se sai già che una build non userà mai OpenSSL, resta la scelta giusta. Se non lo sai ancora, lasciala disattivata e decidi all'avvio.
Perché è importante
- Una sola build. I clienti che devono distribuire senza OpenSSL, per motivi di licenza, un audit di sicurezza che chiede conto di ogni binario di terze parti, o macchine bloccate dove nessuno può copiare una DLL, ricevono lo stesso eseguibile di tutti gli altri.
- Un fallback.
cbAutomantiene un'applicazione funzionante quando le librerie OpenSSL mancano, invece di fallire alla prima firma. - Mobile. Su iOS e Android non c'è OpenSSL da includere per la crittografia dell'applicazione.
- Lo stesso codice ovunque. L'interruttore funziona allo stesso modo su Windows, Linux, macOS, iOS e Android, con Delphi 7 fino a Delphi 13 e C++Builder.
Aggiornamento
Nulla cambia finché non imposti la variabile, perché cbOpenSSL è il valore predefinito. Per provare il backend nativo, aggiungi le due righe sopra al tuo file di progetto, esegui i tuoi test e confronta i risultati. L'elenco completo di cosa segue l'interruttore, e quale impostazione serve in ogni area per avere zero OpenSSL a runtime, è nell'argomento della guida Running without OpenSSL.
Continua a leggere
- Delphi TLS 1.3 senza DLL OpenSSL, il lato della connessione
Domande, feedback o aiuto per la migrazione? Mettiti in contatto. Riceverai una risposta dalle persone che hanno scritto il codice.
