OpenSSL of native cryptografie in Delphi: kies tijdens runtime

· Componenten
OpenSSL of native cryptografie in Delphi: kies tijdens runtime

Het verwijderen van de OpenSSL-DLL's uit een Delphi-toepassing was vroeger een buildbeslissing. Je zette een compilerdefine aan, herbouwde, en leverde een tweede uitvoerbaar bestand uit aan de klanten die geen OpenSSL op hun machine mochten hebben. sgcWebSockets 2026.10 maakt er een runtimebeslissing van: één globale variabele, één keer ingesteld bij het opstarten, bepaalt of de cryptografie van de toepassing draait op OpenSSL of op de cryptografie die in de library is ingebouwd, geschreven in Object Pascal.

De verbindingskant, TLS zonder OpenSSL, komt aan bod in Delphi TLS 1.3 zonder OpenSSL-DLL's. Dit artikel gaat over al het overige: de handtekeningen, hashes, sleuteluitwisseling en versleuteling die je toepassing buiten de TLS-handshake om uitvoert.

Eén regel bij het opstarten

De unit sgcBase_Helpers declareert de globale sgcCryptoBackend, van het type TsgcCryptoBackend:

uses
  sgcBase_Helpers;

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

De schakelaar is globaal, niet per component, dus stel hem in voordat er een component wordt aangemaakt. sgcCheckNativeCrypto is optioneel: als de native crypto-units niet zijn meegecompileerd, geeft het bij het opstarten een duidelijke melding in plaats van bij de eerste handtekening die je toepassing probeert te maken.

Drie waarden

cbAuto is de juiste keuze voor producten die op beide manieren worden uitgeleverd. Sommige klanten installeren de OpenSSL-libraries naast het uitvoerbare bestand, andere mogen dat niet, en dezelfde build werkt voor beide zonder een supportticket over een ontbrekende DLL.

// same executable, with or without the OpenSSL libraries beside it
sgcCryptoBackend := cbAuto;

Wat de schakelaar bepaalt

De schakelaar geldt voor de cryptografie die de componenten namens jou uitvoeren:

Voor geen van deze is een codewijziging nodig. Een JWT die gisteren met OpenSSL werd ondertekend, wordt vandaag native ondertekend omdat de variabele dat zegt.

De verbindingen zijn een aparte instelling

sgcCryptoBackend verandert niets aan de manier waarop een component verbinding maakt. De TLS van een verbinding wordt per component gekozen, met IOHandler = iohNativeTLS, op de TCP-, HTTP- en WebSocket-componenten en alles wat daarop is gebouwd, zoals MQTT, op QUIC en HTTP/3, en op DTLSOptions voor WebRTC:

sgcCryptoBackend := cbNative;                  // application crypto
oClient.TLSOptions.IOHandler := iohNativeTLS;  // this connection

Een component die de OpenSSL-handler behoudt, laadt bij het verbinden nog steeds OpenSSL. Met iohNativeTLS op QUIC, HTTP/3 en DTLS wordt helemaal geen OpenSSL gebruikt, wat de schakelaar ook zegt. Een toepassing die nergens OpenSSL wil, stelt beide in: de schakelaar voor de cryptografie, en de handler op elke component die een beveiligde verbinding opent.

De define is nu optioneel

Tot nu toe betekende draaien zonder OpenSSL de compilerdefine SGC_NATIVE_CRYPTO. Die is niet langer nodig. Zonder de define worden zowel de OpenSSL- als de native code meegecompileerd, en beslist de variabele tijdens runtime.

De define heeft nog wel nut. Hij forceert de native backend wat sgcCryptoBackend ook zegt, en verwijdert de OpenSSL-code uit de crypto-units van de toepassing, waardoor het uitvoerbare bestand kleiner wordt. Als je weet dat een build nooit OpenSSL zal gebruiken, is dit nog steeds de juiste keuze. Weet je dat nog niet, laat de define dan uit en beslis bij het opstarten.

Waarom dit ertoe doet

Upgraden

Er verandert niets totdat je de variabele instelt, want cbOpenSSL is de standaardwaarde. Om de native backend te proberen, voeg je de twee regels hierboven toe aan je projectbestand, draai je je tests, en vergelijk je de resultaten. De volledige lijst van wat onder de schakelaar valt, en welke instelling elk onderdeel nodig heeft voor nul OpenSSL tijdens runtime, staat in het help-onderwerp Draaien zonder OpenSSL.

Lees verder

Vragen, feedback of hulp bij migratie? Neem contact op. Je krijgt antwoord van de mensen die de code hebben geschreven.