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 TsgcWebSocketHTTPServer — Windows 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:
- SSL aktivieren — Setze die Eigenschaft
SSLaufTrue. - SChannel als IOHandler wählen — Setze
SSLOptions.IOHandleraufiohSChannel. - TLS-Version wählen — Setze
SSLOptions.Versionauf die gewünschte Version.tls1_2wird für die meisten Deployments empfohlen. - Port setzen — Setze
SSLOptions.PortundPortauf den Lauschport (typischerweise 443). - 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
- Nur Windows. SChannel ist eine Windows-API. Für plattformübergreifende Server (Linux, macOS) verwende OpenSSL (
iohOpenSSL). - Privater Schlüssel erforderlich. Das Serverzertifikat muss seinen privaten Schlüssel enthalten. Bei der Methode mit dem Windows-Zertifikatsspeicher muss das Zertifikat mit seinem privaten Schlüssel importiert worden sein.
- Nur PFX-Format. SChannel akzeptiert PFX-Zertifikatsdateien (.pfx / .p12). Hast du PEM-Dateien, konvertiere sie zuerst mit dem Befehl
openssl pkcs12in PFX. - Local-Machine-Speicher für Dienste. Verwende
scspStoreLocalMachinefür Produktionsserver, damit das Zertifikat unabhängig vom Benutzerkonto verfügbar ist. - Verfügbarkeit der Edition. Serverseitiges SChannel ist in den Editionen Professional, Enterprise und All-Access von sgcWebSockets verfügbar.
