TsgcWebSocketClient › Właściwości › TLSOptions
Konfiguruje certyfikaty, wersję TLS, ALPN, IOHandler i inne szczegóły bezpiecznego połączenia używane gdy TLS jest włączony.
property TLSOptions: TsgcWSTLS_Options read FTLSOptions write SetTLSOptions;
Preset=tlspCustom
Dostępne tylko wtedy, gdy TLS ma wartość True. Podwłaściwości obejmują RootCertFile, CertFile, KeyFile, Password, VerifyCertificate, VerifyDepth, Version (od tlsUndefined po tls1_3), ALPNProtocols oraz IOHandler (iohOpenSSL, iohSChannel, iohAndroidTLS, iohAppleTLS lub iohNativeTLS). W systemie Android iohAndroidTLS używa natywnego TLS platformy (javax.net.ssl.SSLEngine), a w iOS i macOS iohAppleTLS używa natywnego TLS firmy Apple, dzięki czemu nie trzeba wdrażać żadnych bibliotek OpenSSL; natywny TLS platformy wymaga edycji Enterprise. Ustawienia specyficzne dla OpenSSL znajdują się w OpenSSL_Options, a ustawienia specyficzne dla SChannel w SChannel_Options.
VerifyCertificate kontroluje walidację certyfikatu w ten sam sposób dla każdego IOHandler, w tym iohSChannel: domyślnie ma wartość False, dlatego serwer prezentujący certyfikat samopodpisany, wygasły lub z niezgodną nazwą hosta jest akceptowany bez żadnego ostrzeżenia, dopóki nie zostanie ustawiona wartość True. W przypadku SChannel walidacja jest następnie przeprowadzana w oparciu o magazyn certyfikatów systemu Windows; zdarzenie OnSChannelVerifyPeer pozwala aplikacji sprawdzić łańcuch certyfikatów lub zaakceptować certyfikat, który w innym przypadku zostałby odrzucony.
VerifyCertificate nie mówi nic o tym, czy certyfikat został unieważniony od chwili jego wystawienia, dlatego skradziony klucz, którego certyfikat unieważniono, ale który jeszcze nie wygasł, nadal się uwierzytelnia. W przypadku iohSChannel stan unieważnienia jest sprawdzany tylko wtedy, gdy SChannel_Options.Revocation.Check ma wartość inną niż scrcDisabled (domyślna): scrcEndCertificate sprawdza wyłącznie certyfikat serwera, scrcChainExcludeRoot sprawdza go razem z certyfikatami pośrednimi, a scrcChain obejmuje także certyfikat główny. Revocation.Timeout ogranicza całe pobieranie informacji CRL i OCSP (domyślnie 5000 ms), aby nieosiągalny responder nie mógł zablokować uzgadniania, Revocation.CacheOnly używa wyłącznie tego, co system Windows ma już w pamięci podręcznej, i nigdy nie sięga do sieci, a Revocation.IgnoreRevocationOffline oraz Revocation.IgnoreNoRevocationCheck (obie True) decydują, czy nieosiągalny responder lub certyfikat niepublikujący informacji o unieważnieniu są akceptowane. Certyfikat potwierdzony jako unieważniony jest zawsze odrzucany. Zobacz SChannel Certificate Revocation.
Preset stosuje zestaw bezpiecznych ustawień domyślnych w jednym przypisaniu. Przy tlspCustom (domyślnie) każda opcja zachowuje wartość skonfigurowaną ręcznie, zachowując dotychczasowe zachowanie. Ustawienie Preset := tlspSecureDefaults włącza weryfikację certyfikatu (VerifyCertificate := True), podnosi Version do TLS 1.2 wyłącznie wtedy, gdy była ustawiona na tls1_0 lub tls1_1 (tlsUndefined pozostaje bez zmian, dzięki czemu TLS 1.3 nadal jest dostępny), ustawia OpenSSL_Options.VersionMin i SChannel_Options.VersionMin na tls1_2, gdy były niższe lub nieokreślone, włącza sprawdzanie nazwy hosta certyfikatu serwera (walidacja nazwy hosta OpenSSL X509Checks) oraz włącza sprawdzanie unieważnienia SChannel jako scrcChainExcludeRoot. Poszczególne opcje można nadal dostosowywać po zastosowaniu presetu.
IOHandler przyjmuje również wartość iohNativeTLS, czyli silnik TLS napisany w całości w Object Pascal, wchodzący w skład pakietu sgcCrypto, który obsługuje TLS 1.3 i TLS 1.2. Nie ładuje on żadnej biblioteki OpenSSL i w TLS 1.3 oferuje hybrydowe postkwantowe grupy wymiany kluczy z RFC 10024, z X25519MLKEM768 na pierwszym miejscu, dzięki czemu klient, który go wybierze, negocjuje postkwantową wymianę kluczy z każdym serwerem, który ją obsługuje. Dwie listy preferencji to NativeTLS_Options.Groups i NativeTLS_Options.CipherSuites, rozdzielane dwukropkami w stylu OpenSSL, a pusta lista pozostawia domyślne ustawienia silnika.
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 negocjują TLS 1.3 lub TLS 1.2, tls1_3 negocjuje wyłącznie TLS 1.3, a tls1_0 lub tls1_1 zgłaszają błąd konfiguracji przy połączeniu, ponieważ silnik obsługuje wyłącznie TLS 1.2 i TLS 1.3. Dla samego 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 ufa certyfikatom głównym z RootCertFile, a NativeTLS_Options.UseSystemRoots (domyślnie False) dodaje certyfikaty, którym ufa system operacyjny: systemowy magazyn certyfikatów Windows ROOT, certyfikaty zakotwiczenia (anchor) z Security.framework na macOS (z /etc/ssl/cert.pem jako rezerwą), ocena łańcucha drugiej strony przez Security.framework na iOS, folder Conscrypt albo /system/etc/security/cacerts na Androidzie, a w systemie Linux pierwszy znaleziony plik pakietu CA spośród sześciu standardowych lokalizacji, poczynając od /etc/ssl/certs/ca-certificates.crt. Gdy nie znaleziono żadnego certyfikatu systemowego, VerifyCertificate := True wymaga pliku z certyfikatami głównymi. CertFile może być też plikiem .pfx lub .p12, otwieranym za pomocą Password. Silnik wznawia sesje za pomocą biletów sesji TLS 1.3 i TLS 1.2, przechowywanych w pamięci podręcznej sesji komponentu, dzięki czemu ponowne połączenie pomija pełne uzgadnianie. NativeTLS_Options.SessionTickets (domyślnie True) włącza to, a wznowienie w TLS 1.2 wymaga, aby serwer obsługiwał rozszerzony sekret główny. Nie wysyła danych 0-RTT i nie zgłasza zdarzenia OnSSLVerifyPeer, które należy do handlera OpenSSL. Aby wskazać nazwę, którą musi nieść certyfikat, ustaw OpenSSL_Options.X509Checks.HostName albo IPAddress, ponieważ silnik natywny również odczytuje te wartości. Zobacz Natywny TLS.
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.VerifyCertificate := true;
oClient.TLSOptions.RootCertFile := 'cacert.pem';
oClient.Active := true;