OpenSSL o crittografia nativa in Delphi: scegli a runtime

· Componenti
OpenSSL o crittografia nativa in Delphi: scegli a runtime

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

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:

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

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

Domande, feedback o aiuto per la migrazione? Mettiti in contatto. Riceverai una risposta dalle persone che hanno scritto il codice.