Serwer SSL | SChannel dla serwerów Indy

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.

Jak to działa

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.

Konfiguracja

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ści SChannel_Options

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.

Certyfikat z magazynu systemu Windows

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;

Certyfikat z pliku PFX

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

Wersja TLS

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

Lista szyfrów

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.

Starsze poświadczenia

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.

Unieważnianie certyfikatu klienta

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.

Zalety w porównaniu z OpenSSL

Uwagi