TsgcWebSocketProxyServer › Properties › SSLOptions
Przechowuje ścieżki certyfikatów, wybór wersji TLS oraz konfigurację OpenSSL dla downstream listenera TLS.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Przed aktywowaniem serwera proxy, gdy opcja SSL ma wartość True, należy dostarczyć materiał certyfikatu: RootCertFile, CertFile i KeyFile wskazują na pliki PEM (należy użyć tej samej ścieżki dla wszystkich trzech, gdy plik zawiera pełny łańcuch), a parametr Password jest wymagany tylko wtedy, gdy klucz prywatny jest zaszyfrowany. Należy ustawić VerifyCertificate na True, aby żądać i weryfikować certyfikaty klienta (podopcje FailIfNoCertificate i VerifyClientOnce precyzują sprawdzenie), a parametr VerifyDepth kontroluje długość łańcucha. Parametr Version wskazuje konkretną wersję TLS (tls1_0, tls1_1, tls1_2, tls1_3) lub pozostawia negocjację otwartą (tlsUndefined). Z iohNativeTLS jest to natomiast najniższa dozwolona wersja, zobacz poniżej. Parametr OpenSSL_Options udostępnia zaawansowane ustawienia: APIVersion (oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), LibPath/LibPathCustom do lokalizacji plików binarnych OpenSSL, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin i X509Checks do weryfikacji nazwy hosta/IP. Ustawienia te dotyczą wyłącznie połączenia downstream; gałąź TLS upstream jest włączana przez Proxy.TLS.
IOHandler wybiera silnik TLS. iohOpenSSL jest wartością domyślną, a iohSChannel korzysta z dostawcy systemu Windows. iohNativeTLS wybiera silnik TLS napisany w całości w Object Pascal, wchodzący w skład pakietu sgcCrypto, obsługujący TLS 1.3 i TLS 1.2: nie jest ładowana żadna biblioteka OpenSSL, a w TLS 1.3 hybrydowe postkwantowe grupy wymiany kluczy z RFC 10024 są oferowane z X25519MLKEM768 na pierwszym miejscu. Jego dwie listy preferencji to NativeTLS_Options.Groups i NativeTLS_Options.CipherSuites, rozdzielane dwukropkami w stylu OpenSSL, a pusta lista pozostawia domyślne ustawienia silnika. Silnik działa zarówno w klasycznym modelu jeden wątek na połączenie, jak i na silnikach IOCP oraz EPOLL. iohAppleTLS i iohAndroidTLS to handlery wyłącznie klienckie: serwer z jednym z nich zgłasza wyjątek, gdy Active zostanie ustawione na True, chyba że OnSSLGetHandler dostarczy własny handler. Zamiast nich użyj iohNativeTLS, iohOpenSSL albo, w systemie Windows, iohSChannel.
Dla silnika natywnego Version to najniższa dozwolona wersja, a nie dokładna wersja, jak w przypadku iohOpenSSL. tlsUndefined (wartość domyślna) i tls1_2 akceptują TLS 1.3 i TLS 1.2, tls1_3 akceptuje wyłącznie TLS 1.3, a tls1_0 lub tls1_1 zgłaszają błąd konfiguracji przy uruchamianiu serwera, ponieważ silnik obsługuje wyłącznie TLS 1.2 i TLS 1.3. Aby akceptować wyłącznie TLS 1.2, należy podać w NativeTLS_Options.CipherSuites tylko zestawy szyfrów TLS 1.2, na przykład TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. Silnik weryfikuje certyfikaty klienta względem certyfikatów głównych z RootCertFile oraz, gdy NativeTLS_Options.UseSystemRoots ma wartość True (domyślnie False), także względem certyfikatów, którym ufa system operacyjny. Z iohNativeTLS, CertFile może być też plikiem .pfx lub .p12 zawierającym certyfikat, łańcuch i klucz, otwieranym za pomocą Password. Silnik wznawia sesje za pomocą biletów sesji TLS 1.3 i TLS 1.2: NativeTLS_Options.SessionTickets (domyślnie True) je włącza, a NativeTLS_Options.TicketLifetime (domyślnie 7200 sekund) ustala, jak długo można używać biletu do wznowienia. Wznowienie w TLS 1.2 wymaga, aby klient obsługiwał rozszerzony sekret główny. Nie przyjmuje danych 0-RTT i nie zgłasza zdarzenia OnSSLVerifyPeer, które należy do handlera OpenSSL. VerifyCertificate żąda od klienta certyfikatu i go weryfikuje, VerifyCertificate_Options.FailIfNoCertificate odrzuca klienta, który żadnego nie przesyła, a VerifyClientOnce nie ma tu znaczenia, ponieważ silnik nigdy nie renegocjuje. Zobacz Natywny TLS.
oProxy := TsgcWebSocketProxyServer.Create(nil);
oProxy.SSL := true;
oProxy.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.Version := tls1_3;
oProxy.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oProxy.SSLOptions.Port := 443;
oProxy.Proxy.Host := 'upstream.example.com';
oProxy.Proxy.Port := 8080;
oProxy.Active := true;