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.

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 := TsgcWebSocketHTTPServer.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 := TsgcWebSocketHTTPServer.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.

Zalety w porównaniu z OpenSSL

Uwagi