SChannel Indy Server Delphi

· Funktionen

Jahrelang standen Delphi-Entwickler beim Bereitstellen TLS-fähiger Server unter Windows vor derselben Herausforderung: die richtigen OpenSSL-Bibliotheken mit ihrer Anwendung zu bündeln. Versionskonflikte, fehlende DLLs zur Laufzeit und manuelle Updates nach Security-Advisories waren eine ständige Reibungsquelle in Produktionsumgebungen.

Ab sgcWebSockets 2026.3.0 können die Indy-basierten Server-Komponenten — TsgcWebSocketServer und TsgcWebSocketHTTPServerWindows SChannel (Secure Channel) als TLS-Provider verwenden. SChannel ist die native TLS-Implementierung von Windows, die in jede Windows-Version integriert ist. Sie benötigt keine externen DLLs, integriert sich direkt in den Windows-Zertifikatsspeicher und erhält Sicherheits-Patches automatisch über Windows Update.

Dieser Artikel führt durch die Konfiguration und Bereitstellung SChannel-basierter Server in deinen Delphi-Anwendungen.

Warum SChannel auf der Serverseite?

SChannel beseitigt die häufigsten Bereitstellungsprobleme im Zusammenhang mit TLS auf Windows-Servern.

Keine externen Abhängigkeiten
SChannel ist in Windows integriert. Keine libeay32.dll, keine ssleay32.dll, kein libcrypto, kein libssl. Dein Installer wird kleiner und dein Deployment einfacher.
Windows-Zertifikatsspeicher
Verwende Zertifikate, die bereits vom Betriebssystem installiert und verwaltet werden. Kein Hin- und Herkopieren von PEM-Dateien — verweise das Zertifikat einfach über seinen Thumbprint.
Automatische Sicherheitsupdates
TLS-Verbesserungen und Security-Patches werden über Windows Update eingespielt. Keine manuellen Bibliotheks-Upgrades, keine Redeployments für OpenSSL-CVEs.

Schnellstart — 5 Schritte

Das Aktivieren von SChannel auf deinem Server erfordert nur wenige Eigenschaftsänderungen:

  1. SSL aktivieren — Setze die Eigenschaft SSL auf True.
  2. SChannel als IOHandler wählen — Setze SSLOptions.IOHandler auf iohSChannel.
  3. TLS-Version wählen — Setze SSLOptions.Version auf die gewünschte Version. tls1_2 wird für die meisten Deployments empfohlen.
  4. Port setzen — Setze SSLOptions.Port und Port auf den Lauschport (typischerweise 443).
  5. Zertifikat konfigurieren — Stelle ein Zertifikat über den Windows-Zertifikatsspeicher (Thumbprint) oder eine PFX-Datei bereit.

Methode 1: Zertifikat aus dem Windows-Speicher

Wenn dein Zertifikat bereits im Windows-Zertifikatsspeicher installiert ist, musst du nur seinen Thumbprint angeben. Dies ist der empfohlene Ansatz für Produktionsserver und Windows-Dienste.

Zertifikats-Thumbprint finden

Öffne PowerShell und liste die Zertifikate im persönlichen Speicher des lokalen Computers auf:

PS C:\> dir cert:\localmachine\my
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com
A7F3D2E1B9C84A6D5E0F123456789ABCDEF01234  CN=api.mydomain.com

Kopiere den 40 Zeichen langen hexadezimalen Thumbprint des Zertifikats, das du verwenden willst.

Den Server konfigurieren

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;

Tipp für die Produktion. Verwende immer scspStoreLocalMachine für Server, die als Windows-Dienste laufen. Der Local-Machine-Speicher ist unabhängig vom ausführenden Benutzerkonto zugänglich, während scspStoreCurrentUser an das Profil des angemeldeten Benutzers gebunden ist.

Optionen für den Zertifikatsspeicher

Speichername Konstante Inhalt
Personal (MY) scsnMY Serverzertifikate mit privaten Schlüsseln
Root scsnRoot Vertrauenswürdige Stammzertifizierungsstellen
Trust scsnTrust Vertrauenswürdige Zertifikate
CA scsnCA Zwischenzertifizierungsstellen

Methode 2: Zertifikat aus einer PFX-Datei

Hast du eine PFX-Zertifikatsdatei (.pfx oder .p12), kannst du sie direkt laden, ohne sie im Windows-Zertifikatsspeicher zu installieren. SChannel importiert das Zertifikat beim Server-Start.

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;

Hast du PEM-Dateien? SChannel akzeptiert nur das PFX-Format. Konvertiere dein PEM-Zertifikat und den privaten Schlüssel mit einem einzigen Befehl:

openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx

SChannel_Options-Referenz

Die Untereigenschaft SSLOptions.SChannel_Options stellt alle SChannel-spezifischen Server-Einstellungen bereit.

Eigenschaft Typ Beschreibung
CertHash String Der 40 Zeichen lange hexadezimale Thumbprint eines im Windows-Zertifikatsspeicher installierten Zertifikats.
CertStoreName Enum Zu durchsuchender Speicher: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath Enum Speicherort: scspStoreLocalMachine (empfohlen) oder scspStoreCurrentUser.
CipherList String Durch Doppelpunkte getrennte Liste erlaubter Cipher-Algorithmen (z. B. CALG_AES_256:CALG_AES_128). Leer lassen für Windows-Standardwerte.
UseLegacyCredentials Boolean Bei True wird die alte SCHANNEL_CRED-Struktur verwendet. Aktiviere dies für Windows Server 2019 und älter.

TLS-Versionskonfiguration

Steuere über die Eigenschaft SSLOptions.Version, welche TLS-Protokollversion der Server akzeptiert.

Wert Protokoll Empfehlung
tls1_3 TLS 1.3 Beste Sicherheit. Verwende es, wenn alle Clients es unterstützen.
tls1_2 TLS 1.2 Empfohlen für die meisten Produktions-Deployments.
tls1_1 TLS 1.1 Veraltet. Vermeiden, sofern nicht von alten Clients gefordert.
tls1_0 TLS 1.0 Veraltet. Nicht empfohlen.
tlsUndefined TLS 1.0 – 1.2 Akzeptiert TLS 1.0, 1.1 oder 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-Konfiguration

Standardmäßig verwendet SChannel die systemweite Cipher-Konfiguration, die von Windows verwaltet wird. In Umgebungen mit höheren Anforderungen kannst du die erlaubten Algorithmen einschränken.

// Restrict to AES-256 and AES-128 only
oServer.SSLOptions.SChannel_Options.CipherList :=
  'CALG_AES_256:CALG_AES_128';

Lass die Eigenschaft CipherList leer, um die Windows-Standard-Cipher-Konfiguration zu übernehmen. Das ist für die meisten Deployments geeignet, da Windows einen sicheren Standardsatz pflegt, der über Windows Update aktualisiert wird.

Vorsicht. Werden Ciphers zu aggressiv eingeschränkt, können einige Clients keine Verbindung mehr aufbauen. Teste gründlich mit deinem erwarteten Client-Spektrum, bevor du benutzerdefinierte Cipher-Listen in der Produktion einsetzt.

Kompatibilität mit älterem Windows

Die Komponente verwendet standardmäßig die moderne SCH_CREDENTIALS-API. Auf älteren Windows-Versionen (Server 2019 und früher), die diese API nicht unterstützen, kannst du auf die alte Credential-Struktur zurückgreifen.

// Enable legacy mode for Windows Server 2019 and earlier
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;

In den meisten Fällen erkennt die Komponente die Windows-Version automatisch und wählt die passende API. Verwende die Eigenschaft UseLegacyCredentials nur dann, wenn der Server auf einer älteren Windows-Version nicht startet.

SChannel vs. OpenSSL — Wann welcher Anbieter?

Beide TLS-Provider werden vollständig unterstützt. Die richtige Wahl hängt von deiner Deployment-Plattform und deinen Betriebsanforderungen ab.

Funktion SChannel OpenSSL
Externe DLLs erforderlich Nein Ja
Windows-Zertifikatsspeicher Nativ Nicht unterstützt
Automatische Sicherheitsupdates Ja (Windows Update) Manuelles Bibliotheks-Update
Plattformübergreifend Nur Windows Windows, Linux, macOS
Zertifikatsformate PFX + Windows-Speicher PEM, PFX
TLS 1.0 – 1.3 Ja Ja

Fazit. Läuft dein Server ausschließlich unter Windows, ist SChannel die einfachere, wartungsärmere Wahl. Brauchst du plattformübergreifende Unterstützung, verwende iohOpenSSL. Der Wechsel zwischen beiden erfordert nur die Änderung der Eigenschaft IOHandler — weitere Code-Änderungen sind nicht nötig.

Vollständiges Beispiel: Sicherer WebSocket-Server

Ein vollständig konfigurierter WebSocket-Server, der SChannel mit einem Zertifikat aus dem Windows-Zertifikatsspeicher nutzt.

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;

Funktioniert mit beiden Server-Komponenten

SChannel ist auf beiden Indy-basierten Server-Komponenten verfügbar. Die Konfiguration ist identisch.

Komponente Beschreibung
TsgcWebSocketHTTPServer WebSocket-Server mit integriertem HTTP-Server. Ideal für kombinierte WebSocket + REST-APIs.
TsgcWebSocketServer Reiner WebSocket-Server auf Basis von Indy TCP. Am besten für dedizierte WebSocket-Endpunkte.

Wichtige Hinweise