SChannel Indy-server Delphi

· Functies

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 TsgcWebSocketHTTPServerWindows 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:

  1. SSL inschakelen — Stel de eigenschap SSL in op True.
  2. SChannel als IOHandler selecteren — Stel SSLOptions.IOHandler in op iohSChannel.
  3. Kies een TLS-versie — Stel SSLOptions.Version in op de gewenste versie. tls1_2 wordt aanbevolen voor de meeste deployments.
  4. Stel de poort in — Stel SSLOptions.Port en Port in op de listening-poort (doorgaans 443).
  5. 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