Server SSL | SChannel voor Indy-servers

Op Indy gebaseerde servercomponenten (TsgcWebSocketServer, TsgcWebSocketHTTPServer) kunnen Windows SChannel (Secure Channel) gebruiken als TLS-provider in plaats van OpenSSL. SChannel is de native Windows TLS-implementatie, dus vereist geen externe DLL's.

Hoe het werkt

Wanneer een servercomponent SSL ingeschakeld heeft en de IOHandler is ingesteld op iohSChannel, maakt de server een instantie van TsgcIdServerIOHandlerSSLSChannel aan die alle TLS-bewerkingen afhandelt via de Windows SChannel API. Voor elke inkomende clientverbinding voert de server de TLS-handshake uit via de SChannel-provider, waarbij de protocolversie, cipher suite worden onderhandeld en het geconfigureerde certificaat wordt gebonden.

SChannel leest certificaten uit de Windows-certificaatopslag of uit een PFX-bestand (.pfx / .p12). Er zijn geen PEM-bestanden nodig en er hoeven geen OpenSSL-bibliotheken te worden geïmplementeerd.

Configuratie

Om SChannel op een Indy-server in te schakelen, configureert u de volgende eigenschappen:

1. Stel de eigenschap SSL in op True.

2. Stel SSLOptions.IOHandler in op iohSChannel.

3. Stel SSLOptions.Version in op de gewenste TLS-versie (tls1_2, tls1_3, ...).

4. Stel SSLOptions.Port in op de poort die wordt gebruikt voor beveiligde verbindingen.

5. Configureer het certificaat met een van de twee hieronder beschreven methoden.

SChannel_Options eigenschappen

De sub-eigenschap SSLOptions.SChannel_Options stelt de SChannel-specifieke instellingen beschikbaar:

Eigenschap Beschrijving
CertHash De vingerafdruk (hexadecimale hash) van een certificaat geïnstalleerd in het Windows-certificaatarchief.
CertStoreName Welk certificaatarchief te doorzoeken: scsnMY (Persoonlijk), scsnRoot, scsnTrust, scsnCA.
CertStorePath Store location: scspStoreLocalMachine or scspStoreCurrentUser.
CipherList Optionele door dubbele punten gescheiden lijst van coderingsalgoritmen (bijv. CALG_AES_256:CALG_AES_128). Leeg betekent systeemstandaardinstellingen gebruiken.
UseLegacyCredentials Wanneer True, wordt de verouderde SCHANNEL_CRED-structuur gebruikt in plaats van SCH_CREDENTIALS. Schakel dit in voor oudere Windows-versies die de nieuwere API niet ondersteunen.
Revocation.Check Voor welk deel van de clientcertificaatketen de intrekkingsstatus wordt opgezocht: scrcDisabled (standaard), scrcEndCertificate, scrcChainExcludeRoot of scrcChain.
Revocation.Timeout Milliseconden toegestaan voor het volledige ophalen van CRL- en OCSP-gegevens, niet per URL. Standaard 5000. Nul laat de standaardinstelling van Windows staan, die veel langer kan zijn.
Revocation.CacheOnly Wanneer True, worden alleen intrekkingsgegevens gebruikt die Windows al in de cache heeft en gaat de handshake nooit het netwerk op. Standaard False.
Revocation.IgnoreRevocationOffline Accepteer het clientcertificaat wanneer de responder niet kon worden bereikt, het soft-fail-gedrag. Standaard True. False weigert in plaats daarvan.
Revocation.IgnoreNoRevocationCheck Accepteer een clientcertificaat dat geen CRL-distributiepunt en geen OCSP-responder publiceert. Standaard True.

Daarnaast worden de algemene SSLOptions-eigenschappen CertFile en Password gebruikt bij het laden van een certificaat uit een PFX-bestand.

Certificaat uit Windows-opslag

Als het certificaat al is geïnstalleerd in het Windows-certificaatarchief, geeft u de vingerafdruk van het certificaat op en geeft u aan waar het zich bevindt.

Om de vingerafdruk te vinden, opent u PowerShell en voert u het volgende uit:

dir cert:\localmachine\my

De kolom Thumbprint toont de hexadecimale hash die u nodig heeft.


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;

Certificaat uit PFX-bestand

Als u een PFX-certificaatbestand (.pfx of .p12) heeft, stel dan de eigenschappen CertFile en Password in op SSLOptions. SChannel importeert het certificaat bij het opstarten.


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;

Als u een PEM-certificaat en een privésleutel hebt, converteert u deze eerst naar PFX-indeling met OpenSSL:

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

TLS-versie

Gebruik de eigenschap SSLOptions.Version om te bepalen welke TLS-versie de server accepteert:

Waarde Beschrijving
tls1_0 TLS 1.0 (niet aanbevolen)
tls1_1 TLS 1.1
tls1_2 TLS 1.2 (aanbevolen)
tls1_3 TLS 1.3
tlsUndefined Accepteer TLS 1.0, 1.1 en 1.2

Cipherlijst

Standaard gebruikt SChannel de systeemcipherconfiguratie. U kunt de toegestane ciphers beperken door SChannel_Options.CipherList in te stellen op een door dubbele punten gescheiden lijst van algoritmennamen, bijvoorbeeld:

CALG_AES_256:CALG_AES_128

Laat deze eigenschap leeg om de Windows-standaarden te gebruiken.

Verouderde referenties

Windows Server 2019 en eerder ondersteunen mogelijk niet de nieuwere SCH_CREDENTIALS-API. Als de server niet start op een oudere Windows-versie, stel dan SChannel_Options.UseLegacyCredentials in op True om in plaats daarvan de oudere SCHANNEL_CRED-structuur te gebruiken.

Het component detecteert de Windows-versie automatisch in de meeste gevallen, maar u kunt de verouderde modus forceren als dat nodig is.

Intrekking van clientcertificaten

Wanneer de server clientcertificaten valideert (SSLOptions.VerifyCertificate ingesteld op True), bepalen de sub-eigenschappen van SChannel_Options.Revocation of het certificaat dat een client presenteert ook wordt gecontroleerd bij zijn CRL-distributiepunt of OCSP-responder. Intrekkingscontrole staat standaard uit. Lees Server SSL | Intrekking van clientcertificaten in SChannel voor de volledige beschrijving van elke instelling.

Voordelen ten opzichte van OpenSSL

Opmerkingen