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
cbOpenSSLis de standaardwaarde. De cryptografie van de toepassing draait op OpenSSL, precies zoals in eerdere versies, dus een upgrade verandert niets totdat je de variabele instelt.cbNativelaat de cryptografie van de toepassing draaien op de Object Pascal-implementatie. OpenSSL wordt er nooit voor geladen.cbAutogebruikt OpenSSL wanneer de libraries geladen kunnen worden, en de native code wanneer dat niet lukt. De controle wordt één keer uitgevoerd en het resultaat wordt gecachet.
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:
- de hashing- en HMAC-helpers;
- JWT ondertekenen en verifiëren, HS, RS en ES;
- OAuth2- en DPoP-proofs;
- AWS Signature V4 en ondertekende CloudFront-URL's;
- Web Push;
- end-to-end-versleuteling (E2EE), waarbij peers met verschillende backends onderling werken, zodat een client op
cbNativekan praten met een server die nog op OpenSSL draait; - WebAuthn en passkeys;
- SAML en XML-handtekeningen;
- NTLM;
- AEAD, ML-KEM en HKDF;
- QUIC-pakketbescherming, de DTLS- en WebRTC-certificaten en SRTP.
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
- Eén build. Klanten die zonder OpenSSL moeten uitleveren, vanwege licenties, een beveiligingsaudit die naar elke binary van derden vraagt, of afgesloten machines waar niemand een DLL mag kopiëren, krijgen hetzelfde uitvoerbare bestand als iedereen.
- Een fallback.
cbAutohoudt een toepassing werkend wanneer de OpenSSL-libraries ontbreken, in plaats van te falen bij de eerste handtekening. - Mobiel. Op iOS en Android is er geen OpenSSL om mee te bundelen voor de cryptografie van de toepassing.
- Overal dezelfde code. De schakelaar werkt hetzelfde op Windows, Linux, macOS, iOS en Android, met Delphi 7 tot en met Delphi 13 en C++Builder.
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
- Delphi TLS 1.3 zonder OpenSSL-DLL's, de verbindingskant
Vragen, feedback of hulp bij migratie? Neem contact op. Je krijgt antwoord van de mensen die de code hebben geschreven.
