Delphi-ontwikkelaars die TLS-enabled servers op Windows deployen hebben jarenlang dezelfde uitdaging gehad: de juiste OpenSSL-bibliotheken bij hun toepassing bundelen. Versie-mismatches, ontbrekende DLL's tijdens runtime en handmatige updates na security advisories zijn een constante bron van frictie geweest in productie-omgevingen.
Vanaf sgcWebSockets 2026.3.0 kunnen Indy-gebaseerde server-componenten — TsgcWebSocketServer en TsgcWebSocketHTTPServer — Windows SChannel (Secure Channel) gebruiken als TLS-provider. SChannel is de native Windows TLS-implementatie die in elke versie van Windows is ingebouwd. Het vereist geen externe DLL's, integreert direct met de Windows-certificate-store en ontvangt automatisch security patches via Windows Update.
Dit artikel beschrijft stap voor stap hoe je SChannel-gebaseerde servers in je Delphi-toepassingen configureert en deployt.
Waarom SChannel aan de serverzijde?
SChannel elimineert de meest voorkomende deployment-hoofdpijn die met TLS op Windows-servers samenhangt.
|
Geen externe afhankelijkheden SChannel is in Windows ingebouwd. Geen libeay32.dll, geen ssleay32.dll, geen libcrypto, geen libssl. Je installer wordt kleiner en je deployment wordt eenvoudiger. |
Windows-certificate-store Gebruik certificaten die al door het besturingssysteem zijn geïnstalleerd en beheerd. Geen PEM-bestanden meer rondkopiëren — verwijs gewoon naar het certificaat met zijn thumbprint. |
Automatische security-updates TLS-verbeteringen en security patches worden via Windows Update toegepast. Geen handmatige bibliotheek-upgrades, geen redeployments voor OpenSSL-CVE's. |
Snelstart — 5 stappen
SChannel inschakelen op je server vereist slechts een paar eigenschapswijzigingen:
- SSL inschakelen — Stel de eigenschap
SSLin opTrue. - SChannel als IOHandler selecteren — Stel
SSLOptions.IOHandlerin opiohSChannel. - Kies een TLS-versie — Stel
SSLOptions.Versionin op de gewenste versie.tls1_2wordt aanbevolen voor de meeste deployments. - Stel de poort in — Stel
SSLOptions.PortenPortin op de listening-poort (doorgaans 443). - Configureer het certificaat — Geef een certificaat op via de Windows-certificate-store (thumbprint) of een PFX-bestand.
Methode 1: Certificaat uit de Windows-store
Als je certificaat al in de Windows-certificate-store is geïnstalleerd, hoef je alleen de thumbprint op te geven. Dit is de aanbevolen aanpak voor productieservers en Windows-services.
De thumbprint van het certificaat vinden
Open PowerShell en toon de certificaten in de Local Machine personal store:
PS C:\> dir cert:\localmachine\my
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint Subject
---------- -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10 CN=*.mydomain.com
A7F3D2E1B9C84A6D5E0F123456789ABCDEF01234 CN=api.mydomain.com
Kopieer de hexadecimale thumbprint van 40 tekens van het certificaat dat je wilt gebruiken.
De server configureren
var
oServer: TsgcWebSocketHTTPServer;
begin
oServer := TsgcWebSocketHTTPServer.Create(nil);
// Enable TLS with SChannel
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
// Point to the certificate in the Windows Store
oServer.SSLOptions.SChannel_Options.CertHash :=
'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
// Start listening
oServer.Active := True;
end;
Productietip. Gebruik altijd scspStoreLocalMachine voor servers die als Windows-service worden gedeployed. De Local Machine-store is toegankelijk ongeacht het user account dat de service draait, terwijl scspStoreCurrentUser gekoppeld is aan het profiel van de ingelogde gebruiker.
Opties voor certificate-store
| Store-naam | Constante | Bevat |
|---|---|---|
| Personal (MY) | scsnMY |
Server-certificaten met privésleutels |
| Root | scsnRoot |
Vertrouwde root certification authorities |
| Trust | scsnTrust |
Vertrouwde certificaten |
| CA | scsnCA |
Intermediate certification authorities |
Methode 2: Certificaat uit een PFX-bestand
Als je een PFX-certificaatbestand (.pfx of .p12) hebt, kun je het direct laden zonder het in de Windows-certificate-store te installeren. SChannel importeert het certificaat bij het opstarten van de server.
var
oServer: TsgcWebSocketHTTPServer;
begin
oServer := TsgcWebSocketHTTPServer.Create(nil);
// Enable TLS with SChannel
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
// Load certificate from a PFX file
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
// Start listening
oServer.Active := True;
end;
Heb je PEM-bestanden? SChannel accepteert alleen PFX-formaat. Converteer je PEM-certificaat en privésleutel met één commando:
openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx
SChannel_Options-referentie
De sub-eigenschap SSLOptions.SChannel_Options exposeert alle SChannel-specifieke server-instellingen.
| Eigenschap | Type | Beschrijving |
|---|---|---|
| CertHash | String | De hexadecimale thumbprint van 40 tekens van een certificaat dat in de Windows-certificate-store is geïnstalleerd. |
| CertStoreName | Enum | Welke store doorzocht moet worden: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA. |
| CertStorePath | Enum | Store-locatie: scspStoreLocalMachine (aanbevolen) of scspStoreCurrentUser. |
| CipherList | String | Lijst van toegestane cipher-algoritmen, gescheiden door een dubbele punt (bijv. CALG_AES_256:CALG_AES_128). Laat leeg voor Windows-standaarden. |
| UseLegacyCredentials | Boolean | Wanneer True, wordt de legacy SCHANNEL_CRED-structuur gebruikt. Schakel dit in voor Windows Server 2019 en eerder. |
TLS-versie-configuratie
Bepaal welke TLS-protocolversie de server accepteert via de eigenschap SSLOptions.Version.
| Waarde | Protocol | Aanbeveling |
|---|---|---|
tls1_3 |
TLS 1.3 | Beste beveiliging. Gebruik wanneer alle clients dit ondersteunen. |
tls1_2 |
TLS 1.2 | Aanbevolen voor de meeste productie-deployments. |
tls1_1 |
TLS 1.1 | Legacy. Vermijd tenzij vereist door oude clients. |
tls1_0 |
TLS 1.0 | Afgeschaft. Niet aanbevolen. |
tlsUndefined |
TLS 1.0 – 1.2 | Accepteert TLS 1.0, 1.1 of 1.2. |
// Enforce TLS 1.2 minimum for modern security
oServer.SSLOptions.Version := tls1_2;
// Or use TLS 1.3 for the strongest encryption
oServer.SSLOptions.Version := tls1_3;
Cipher-suite-configuratie
Standaard gebruikt SChannel de systeembrede cipher-configuratie die door Windows wordt beheerd. Voor omgevingen die strikter beheer vereisen, kun je de toegestane algoritmen beperken.
// Restrict to AES-256 and AES-128 only
oServer.SSLOptions.SChannel_Options.CipherList :=
'CALG_AES_256:CALG_AES_128';
Laat de eigenschap CipherList leeg om de standaard cipher-configuratie van Windows te accepteren. Dit is geschikt voor de meeste deployments, aangezien Windows een veilige standaardset onderhoudt die via Windows Update wordt bijgewerkt.
Let op. Te agressief beperken van ciphers kan voorkomen dat sommige clients verbinding maken. Test grondig tegen je verwachte clientbase voordat je aangepaste cipher-lijsten in productie deployt.
Legacy Windows-compatibiliteit
Het component gebruikt standaard de moderne SCH_CREDENTIALS-API. Op oudere Windows-versies (Server 2019 en eerder) die deze API niet ondersteunen, kun je terugvallen op de legacy credential-structuur.
// Enable legacy mode for Windows Server 2019 and earlier
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;
In de meeste gevallen detecteert het component de Windows-versie automatisch en selecteert de juiste API. Gebruik de eigenschap UseLegacyCredentials alleen als de server niet start op een oudere Windows-versie.
SChannel vs. OpenSSL — wanneer welke gebruiken
Beide TLS-providers worden volledig ondersteund. De juiste keuze hangt af van je deployment-platform en operationele vereisten.
| Functie | SChannel | OpenSSL |
|---|---|---|
| Externe DLL's vereist | Nee | Ja |
| Windows-certificate-store | Native | Niet ondersteund |
| Automatische security-updates | Ja (Windows Update) | Handmatige bibliotheek-update |
| Cross-platform | Alleen Windows | Windows, Linux, macOS |
| Certificaatformaten | PFX + Windows-store | PEM, PFX |
| TLS 1.0 – 1.3 | Ja | Ja |
Conclusie. Als je server uitsluitend op Windows draait, is SChannel de eenvoudigere en beter onderhoudbare keuze. Als je cross-platform-ondersteuning nodig hebt, gebruik je iohOpenSSL. Wisselen tussen beide vereist alleen het wijzigen van de eigenschap IOHandler — geen andere codewijzigingen nodig.
Volledig voorbeeld: beveiligde WebSocket-server
Een volledig geconfigureerde WebSocket-server die SChannel gebruikt met een certificaat uit de Windows-certificate-store.
uses
sgcWebSocket_Server, sgcWebSocket_Classes;
var
oServer: TsgcWebSocketHTTPServer;
begin
oServer := TsgcWebSocketHTTPServer.Create(nil);
Try
// Server configuration
oServer.Port := 443;
// TLS configuration with SChannel
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
// Certificate from Windows Certificate Store
oServer.SSLOptions.SChannel_Options.CertHash :=
'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
// Assign WebSocket event handlers
oServer.OnConnect := OnClientConnect;
oServer.OnDisconnect := OnClientDisconnect;
oServer.OnMessage := OnClientMessage;
// Start the server
oServer.Active := True;
WriteLn('Secure WebSocket server listening on port 443 (SChannel TLS 1.2)');
WriteLn('Press Enter to stop...');
ReadLn;
Finally
oServer.Active := False;
oServer.Free;
End;
end;
Werkt met beide server-componenten
SChannel is beschikbaar op beide Indy-gebaseerde server-componenten. De configuratie is identiek.
| Component | Beschrijving |
|---|---|
TsgcWebSocketHTTPServer |
WebSocket-server met ingebouwde HTTP-server. Ideaal voor gecombineerde WebSocket + REST-API's. |
TsgcWebSocketServer |
Pure WebSocket-server gebaseerd op Indy TCP. Het beste voor dedicated WebSocket-endpoints. |
Belangrijke aandachtspunten
- Alleen Windows. SChannel is een Windows-API. Voor cross-platform-servers (Linux, macOS) gebruik je OpenSSL (
iohOpenSSL). - Privésleutel vereist. Het server-certificaat moet zijn privésleutel bevatten. Bij gebruik van de Windows-certificate-store-methode moet het certificaat zijn geïmporteerd met de privésleutel.
- Alleen PFX-formaat. SChannel accepteert PFX-certificaatbestanden (.pfx / .p12). Als je PEM-bestanden hebt, converteer ze dan eerst naar PFX met het commando
openssl pkcs12. - Local Machine-store voor services. Gebruik
scspStoreLocalMachinevoor productieservers, zodat het certificaat beschikbaar is ongeacht het user account. - Editie-beschikbaarheid. Server-side SChannel is beschikbaar in de Professional-, Enterprise- en All-Access-edities van sgcWebSockets.
