Komponenty serwerowe oparte na Indy (TsgcWebSocketServer, TsgcWebSocketHTTPServer) mogą używać Windows SChannel (Secure Channel) jako dostawcy TLS zamiast OpenSSL. SChannel jest natywną implementacją TLS systemu Windows, dlatego nie wymaga zewnętrznych bibliotek DLL.
Gdy komponent serwera ma włączony SSL i IOHandler jest ustawiony na iohSChannel, serwer tworzy instancję TsgcIdServerIOHandlerSSLSChannel, która obsługuje wszystkie operacje TLS za pomocą Windows SChannel API. Dla każdego przychodzącego połączenia klienta serwer wykonuje uzgadnianie TLS przez dostawcę SChannel, negocjując wersję protokołu, zestaw szyfrów i wiążąc skonfigurowany certyfikat.
SChannel odczytuje certyfikaty z magazynu certyfikatów systemu Windows lub z pliku PFX (.pfx / .p12). Pliki PEM nie są wymagane i nie trzeba wdrażać bibliotek OpenSSL.
Aby włączyć SChannel na serwerze Indy, skonfiguruj następujące właściwości:
1. Ustaw właściwość SSL na True.
2. Ustaw SSLOptions.IOHandler na iohSChannel.
3. Ustaw właściwość SSLOptions.Version na żądaną wersję TLS (tls1_2, tls1_3, ...).
4. Ustaw wartość SSLOptions.Port na port używany do bezpiecznych połączeń.
5. Skonfiguruj certyfikat przy użyciu jednej z dwóch opisanych poniżej metod.
Właściwość podrzędna SSLOptions.SChannel_Options udostępnia ustawienia specyficzne dla SChannel:
| Właściwość | Opis |
| CertHash | Odcisk palca (skrót w formacie szesnastkowym) certyfikatu zainstalowanego w magazynie certyfikatów systemu Windows. |
| CertStoreName | Magazyn certyfikatów do przeszukania: scsnMY (Osobisty), scsnRoot, scsnTrust, scsnCA. |
| CertStorePath | Lokalizacja magazynu: scspStoreLocalMachine lub scspStoreCurrentUser. |
| CipherList | Opcjonalna lista algorytmów szyfrowania oddzielona dwukropkami (np. CALG_AES_256:CALG_AES_128). Pusta wartość oznacza użycie domyślnych ustawień systemowych. |
| UseLegacyCredentials | Gdy wartość wynosi True, zamiast SCH_CREDENTIALS używana jest starsza struktura SCHANNEL_CRED. Należy włączyć tę opcję w starszych wersjach systemu Windows, które nie obsługują nowszego API. |
| Revocation.Check | Dla jakiej części łańcucha certyfikatów klienta pobierany jest stan unieważnienia: scrcDisabled (wartość domyślna), scrcEndCertificate, scrcChainExcludeRoot lub scrcChain. |
| Revocation.Timeout | Liczba milisekund przeznaczona na całe pobranie list CRL i odpowiedzi OCSP, a nie na pojedynczy adres URL. Wartość domyślna to 5000. Zero pozostawia domyślne ustawienie systemu Windows, które może być znacznie dłuższe. |
| Revocation.CacheOnly | Przy wartości True używane są wyłącznie dane o unieważnieniu, które system Windows ma już w pamięci podręcznej, a uzgadnianie nigdy nie sięga do sieci. Wartość domyślna to False. |
| Revocation.IgnoreRevocationOffline | Akceptuje certyfikat klienta, gdy nie udało się połączyć z responderem, czyli łagodne zachowanie (soft-fail). Wartość domyślna to True. Wartość False powoduje odrzucenie. |
| Revocation.IgnoreNoRevocationCheck | Akceptuje certyfikat klienta, który nie publikuje ani punktu dystrybucji CRL, ani respondera OCSP. Wartość domyślna to True. |
Ponadto ogólne właściwości SSLOptions CertFile i Password są używane podczas ładowania certyfikatu z pliku PFX.
Jeśli certyfikat jest już zainstalowany w magazynie certyfikatów Windows, należy podać odcisk palca certyfikatu i wskazać jego lokalizację.
Aby znaleźć odcisk palca, otwórz PowerShell i uruchom:
dir cert:\localmachine\my
Kolumna Thumbprint pokazuje szesnastkowy skrót, który jest potrzebny.
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;
Jeśli posiadasz plik certyfikatu PFX (.pfx lub .p12), ustaw właściwości CertFile i Password w SSLOptions. SChannel zaimportuje certyfikat podczas uruchamiania.
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;
Jeśli posiadasz certyfikat PEM i klucz prywatny, należy je najpierw przekonwertować do formatu PFX przy użyciu OpenSSL:
openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx
Użyj właściwości SSLOptions.Version do kontrolowania, które wersje TLS serwer akceptuje:
| Wartość | Opis |
| tls1_0 | TLS 1.0 (niezalecane) |
| tls1_1 | TLS 1.1 |
| tls1_2 | TLS 1.2 (zalecane) |
| tls1_3 | TLS 1.3 |
| tlsUndefined | Akceptuj TLS 1.0, 1.1 i 1.2 |
Domyślnie SChannel używa systemowej konfiguracji szyfrowania. Można ograniczyć dozwolone szyfry, ustawiając SChannel_Options.CipherList na listę nazw algorytmów oddzielonych dwukropkami, na przykład:
CALG_AES_256:CALG_AES_128
Pozostaw tę właściwość pustą, aby używać wartości domyślnych systemu Windows.
Windows Server 2019 i wcześniejsze wersje mogą nie obsługiwać nowszego interfejsu API SCH_CREDENTIALS. Jeśli uruchomienie serwera na starszej wersji systemu Windows nie powiedzie się, należy ustawić SChannel_Options.UseLegacyCredentials na True, aby użyć starszej struktury SCHANNEL_CRED.
Komponent automatycznie wykrywa wersję systemu Windows w większości przypadków, ale w razie potrzeby można wymusić tryb legacy.
Gdy serwer weryfikuje certyfikaty klienta (SSLOptions.VerifyCertificate ustawione na True), właściwości podrzędne SChannel_Options.Revocation rozstrzygają, czy certyfikat przedstawiony przez klienta jest dodatkowo sprawdzany względem jego punktu dystrybucji CRL lub respondera OCSP. Unieważnianie jest domyślnie wyłączone. Przeczytaj Serwer SSL | Unieważnianie certyfikatu klienta w SChannel, aby poznać pełny opis każdego ustawienia.