Server SSL | SChannel for Indy Servers

Indy-basierte Serverkomponenten (TsgcWebSocketServer, TsgcWebSocketHTTPServer) können Windows SChannel (Secure Channel) als TLS-Anbieter anstelle von OpenSSL verwenden. SChannel ist die native Windows-TLS- Implementierung, sodass es keine externen DLLs erfordert.

Wie es funktioniert

Wenn eine Server-Komponente SSL aktiviert hat und der IOHandler auf iohSChannel gesetzt ist, erstellt der Server eine TsgcIdServerIOHandlerSSLSChannel-Instanz, die alle TLS-Operationen über die Windows-SChannel-API verarbeitet. Für jede eingehende Client-Verbindung führt der Server den TLS-Handshake über den SChannel-Anbieter durch, handelt die Protokollversion und Cipher-Suite aus und bindet das konfigurierte Zertifikat.

SChannel liest Zertifikate aus dem Windows- Zertifikatspeicher oder aus einer PFX- Datei (.pfx / .p12). Es werden keine PEM-Dateien benötigt und es müssen keine OpenSSL-Bibliotheken bereitgestellt werden.

Konfiguration

Um SChannel auf einem Indy-Server zu aktivieren, konfigurieren Sie die folgenden Eigenschaften:

1. Setzen Sie die Eigenschaft SSL auf True.

2. Setzen Sie SSLOptions.IOHandler auf iohSChannel.

3. Setzen Sie SSLOptions.Version auf die gewünschte TLS-Version (tls1_2, tls1_3, ...).

4. Setzen Sie SSLOptions.Port auf den für sichere Verbindungen verwendeten Port.

5. Konfigurieren Sie das Zertifikat mit einer der beiden unten beschriebenen Methoden.

SChannel_Options Eigenschaften

Die Untereigenschaft SSLOptions.SChannel_Options stellt die SChannel-spezifischen Einstellungen bereit:

Eigenschaft Beschreibung
CertHash Der Thumbprint (hexadezimaler Hash) eines im Windows-Zertifikatspeicher installierten Zertifikats.
CertStoreName Welcher Zertifikatspeicher durchsucht werden soll: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath Speicherort: scspStoreLocalMachine oder scspStoreCurrentUser.
CipherList Optionale, durch Doppelpunkt getrennte Liste von Verschlüsselungsalgorithmen (z. B. CALG_AES_256:CALG_AES_128). Leer bedeutet, Systemstandards verwenden.
UseLegacyCredentials Wenn True, wird die Legacy-Struktur SCHANNEL_CRED anstelle von SCH_CREDENTIALS verwendet. Aktivieren Sie dies für ältere Windows-Versionen, die die neuere API nicht unterstützen.
Revocation.Check Für welchen Teil der Client-Zertifikatskette der Widerrufsstatus abgefragt wird: scrcDisabled (Standard), scrcEndCertificate, scrcChainExcludeRoot oder scrcChain.
Revocation.Timeout Millisekunden, die für den gesamten Abruf über CRL und OCSP zur Verfügung stehen, nicht pro URL. Standard 5000. Null belässt den Windows-Standardwert, der deutlich länger sein kann.
Revocation.CacheOnly Bei True werden nur Widerrufsdaten verwendet, die Windows bereits zwischengespeichert hat, und der Handshake greift nie auf das Netzwerk zu. Standard False.
Revocation.IgnoreRevocationOffline Akzeptiert das Client-Zertifikat, wenn der Responder nicht erreicht werden konnte, das Soft-Fail-Verhalten. Standard True. Bei False wird es stattdessen abgelehnt.
Revocation.IgnoreNoRevocationCheck Akzeptiert ein Client-Zertifikat, das keinen CRL-Verteilungspunkt und keinen OCSP-Responder veröffentlicht. Standard True.

Zusätzlich werden die allgemeinen SSLOptions- Eigenschaften CertFile und Password verwendet, wenn ein Zertifikat aus einer PFX-Datei geladen wird.

Zertifikat aus dem Windows Store

Wenn das Zertifikat bereits im Windows-Zertifikatspeicher installiert ist, geben Sie den Fingerabdruck des Zertifikats an und geben Sie an, wo es sich befindet.

Um den Thumbprint zu finden, öffnen Sie PowerShell und führen Sie aus:

dir cert:\localmachine\my

Die Spalte Thumbprint zeigt den hexadezimalen Hash an, den Sie benötigen.


Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com


oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.SChannel_Options.CertHash := 'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
oServer.Active := True;

Zertifikat aus PFX-Datei

Wenn Sie eine PFX-(.pfx- oder .p12-)Zertifikatdatei haben, setzen Sie die Eigenschaften CertFile und Password in SSLOptions. SChannel importiert das Zertifikat beim Start.


oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
oServer.Active := True;

Wenn Sie ein PEM-Zertifikat und einen privaten Schlüssel haben, konvertieren Sie sie zuerst mit OpenSSL in das PFX-Format:

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

TLS-Version

Verwenden Sie die Eigenschaft SSLOptions.Version, um zu steuern, welche TLS-Version der Server akzeptiert:

Value Beschreibung
tls1_0 TLS 1.0 (nicht empfohlen)
tls1_1 TLS 1.1
tls1_2 TLS 1.2 (empfohlen)
tls1_3 TLS 1.3
tlsUndefined TLS 1.0, 1.1 und 1.2 akzeptieren

Cipher List

Standardmäßig verwendet SChannel die System-Cipher-Konfiguration. Sie können die erlaubten Cipher einschränken, indem Sie SChannel_Options.CipherList auf eine durch Doppelpunkte getrennte Liste von Algorithmusnamen setzen, zum Beispiel:

CALG_AES_256:CALG_AES_128

Lassen Sie diese Eigenschaft leer, um die Windows-Standardwerte zu verwenden.

Legacy Credentials

Windows Server 2019 und früher unterstützen möglicherweise nicht die neuere SCH_CREDENTIALS- API. Wenn der Server auf einer älteren Windows-Version nicht startet, setzen Sie SChannel_Options.UseLegacyCredentials auf True, um stattdessen die veraltete SCHANNEL_CRED-Struktur zu verwenden.

Die Komponente erkennt die Windows-Version in den meisten Fällen automatisch, aber Sie können bei Bedarf den Legacy-Modus erzwingen.

Client Certificate Revocation

Wenn der Server Client-Zertifikate überprüft (SSLOptions.VerifyCertificate auf True gesetzt), entscheiden die Untereigenschaften SChannel_Options.Revocation, ob das von einem Client vorgelegte Zertifikat zusätzlich gegen seinen CRL-Verteilungspunkt oder OCSP-Responder geprüft wird. Der Widerruf ist standardmäßig deaktiviert. Unter Server SSL | SChannel Client Certificate Revocation finden Sie die vollständige Beschreibung jeder Einstellung.

Vorteile gegenüber OpenSSL

Hinweise