Obsługiwane przez
TsgcWebSocketLoadBalancerServer
*Wymaga pakietu sgcCrypto, dostarczanego od edycji Standard wzwyż.
Natywny silnik TLS to implementacja TLS 1.3 i TLS 1.2 napisana w całości w Object Pascal na bazie jednostek sgcCrypto. Nie jest to wiązanie do obcej biblioteki: nie ma tu żadnej biblioteki DLL OpenSSL do wdrożenia, żadnego wywołania SChannel ani żadnej systemowej biblioteki TLS. Ten sam kod źródłowy kompiluje się od Delphi 7 do RAD Studio 13 i działa na każdej platformie obsługiwanej przez komponenty.
Powodem, dla którego warto po niego sięgnąć, jest wymiana kluczy. Silnik oferuje hybrydowe grupy postkwantowe z RFC 10024, a X25519MLKEM768 jest pierwszą grupą, jaką proponuje, więc klient, który się na niego przełączy, negocjuje postkwantową wymianę kluczy z każdym serwerem, który ją obsługuje, bez żadnej innej zmiany w aplikacji. Grupy hybrydowe istnieją tylko w TLS 1.3, więc połączenie, które przechodzi na TLS 1.2, korzysta z klasycznej krzywej. Zobacz Kryptografia postkwantowa, aby dowiedzieć się, czym są te grupy i dlaczego konstrukcja hybrydowa jest dziś rozsądną drogą migracji.
Włączanie silnika
Ustaw IOHandler i nic więcej się nie zmienia. Używane dotąd właściwości certyfikatu, klucza, certyfikatu głównego, weryfikacji i ALPN działają dalej, silnik odczytuje dokładnie te same.
// client
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.RootCertFile := 'cacert.pem';
oClient.Active := True;
// server
oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.CertFile := 'certificate.pem';
oServer.SSLOptions.KeyFile := 'key.pem';
oServer.Active := True;
Na serwerze silnik działa również na silnikach sterowanych zdarzeniami. Ustaw IOHandlerOptions.IOHandlerType na iohIOCP w systemie Windows albo na iohEPOLL w systemie Linux, a handler zostanie zbudowany na odpowiadającym mu dostawcy TLS, więc ta sama konfiguracja działa na wszystkich trzech silnikach.
Wybranie iohNativeTLS w kompilacji bez pakietu sgcCrypto zgłasza wyjątek, który wprost o tym mówi, zamiast po cichu przechodzić na inną bibliotekę.
Wersje TLS
Silnik obsługuje TLS 1.3 i TLS 1.2, zarówno jako klient, jak i jako serwer, na kliencie Indy, na serwerze Indy oraz na silnikach serwera IOCP i EPOLL. TLS 1.3 jest zawsze wybierany, gdy obie strony go obsługują. Dla natywnego silnika TLSOptions.Version po stronie klienta i SSLOptions.Version po stronie serwera to najniższa dopuszczalna wersja.
| Wersja | Negocjuje |
| tlsUndefined (wartość domyślna) | TLS 1.3 lub TLS 1.2 |
| tls1_2 | TLS 1.3 lub TLS 1.2 |
| tls1_3 | Tylko TLS 1.3 |
| tls1_0, tls1_1 | Nic. Klient zgłasza błąd konfiguracji przy nawiązywaniu połączenia, a serwer przy starcie, ponieważ silnik obsługuje wyłącznie TLS 1.2 i TLS 1.3. |
Handler OpenSSL odczytuje tę właściwość inaczej. Przy iohOpenSSL tls1_2 oznacza dokładnie TLS 1.2, natomiast przy iohNativeTLS oznacza TLS 1.2 lub nowszy. O reszcie decyduje lista zestawów szyfrów. Aby uzyskać wyłącznie TLS 1.2, pozostaw Version na tls1_2 i wymień w NativeTLS_Options.CipherSuites tylko zestawy TLS 1.2. Lista, która wymienia tylko zestawy TLS 1.3, daje wyłącznie TLS 1.3, a lista z zestawami obu wersji dopuszcza obie. Version ustawione na tls1_3 razem z listą zestawów TLS 1.2 nie pozostawia żadnej wersji do wynegocjowania, a połączenie zgłasza wyjątek przy starcie.
// TLS 1.3 and TLS 1.2, tls1_2 is the lowest version allowed
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.TLSOptions.Version := tls1_2;
// TLS 1.3 only
oClient.TLSOptions.Version := tls1_3;
// TLS 1.2 only: name TLS 1.2 suites and no TLS 1.3 suite
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.NativeTLS_Options.CipherSuites :=
'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256';
Grupy i zestawy szyfrów
TLSOptions.NativeTLS_Options po stronie klienta i SSLOptions.NativeTLS_Options po stronie serwera niosą dwie listy preferencji. Obie są łańcuchami w stylu OpenSSL, z pozycjami rozdzielonymi dwukropkami, od najbardziej preferowanej, a jedna lista obsługuje razem TLS 1.3 i TLS 1.2. Pozostaw jedną z nich pustą, aby zachować ustawienie domyślne silnika. Nieprawidłowa lista zgłasza wyjątek przy nawiązywaniu połączenia, więc literówka nie zostanie po cichu zignorowana.
| Właściwość | Akceptowane nazwy | Wartość domyślna |
| Groups | X25519MLKEM768, SecP256r1MLKEM768, SecP384r1MLKEM1024, X25519, secp256r1, secp384r1. Akceptowane są także aliasy P-256, prime256v1 i P-384, a nazwy są porównywane bez rozróżniania wielkości liter. Trzy grupy hybrydowe są dostępne wyłącznie w TLS 1.3. | X25519MLKEM768:X25519:secp256r1:secp384r1 |
| CipherSuites | TLS 1.3: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256. TLS 1.2: zestawy z tabeli poniżej. Akceptowane są zarówno nazwy IANA, jak i nazwy w stylu OpenSSL, takie jak ECDHE-RSA-AES128-GCM-SHA256, a silnik raportuje nazwę IANA. | TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256, plus domyślne zestawy TLS 1.2 poniżej |
Pierwsza grupa na liście jest tą, dla której klient wysyła udział klucza, więc pozostawienie X25519MLKEM768 na początku sprawia, że już pierwsza wymiana pakietów jest postkwantowa. Poprzedzenie pozycji znakiem zapytania pomija ją, gdy dana kompilacja jej nie zawiera, a każda inna nieznana lub niedostępna pozycja unieważnia całą listę.
// only the hybrid post-quantum groups, and only AES-256-GCM
oClient.TLSOptions.NativeTLS_Options.Groups :=
'X25519MLKEM768:SecP256r1MLKEM768:SecP384r1MLKEM1024';
oClient.TLSOptions.NativeTLS_Options.CipherSuites := 'TLS_AES_256_GCM_SHA384';
// tolerate a build where X25519 is not compiled in
oClient.TLSOptions.NativeTLS_Options.Groups := '?X25519MLKEM768:secp256r1';
Zestawy szyfrów TLS 1.2
Domyślnie włączone są tylko zestawy AEAD z utajnianiem z wyprzedzeniem (forward secrecy). Zestawy AES-CBC oraz wymiana kluczy RSA są dostępne dla partnerów, którzy nie potrafią nic lepszego, i są oferowane lub akceptowane tylko wtedy, gdy wymienia je CipherSuites.
| Zestawy | Włączone |
| TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | Domyślnie, w tej kolejności. |
| TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | Tylko gdy wymienione w CipherSuites. |
| TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256 | Tylko gdy wymienione w CipherSuites. Wymiana kluczy RSA nie zapewnia utajniania z wyprzedzeniem. |
Zestawy ECDHE połączenia TLS 1.2 korzystają z klasycznej grupy z listy Groups: X25519, secp256r1 albo secp384r1, dlatego gdy muszą się łączyć partnerzy TLS 1.2, pozostaw na liście co najmniej jedną z nich. Wymiana kluczy RSA nie używa żadnej grupy.
// TLS 1.3, and TLS 1.2 with AES-GCM plus AES-CBC for older clients
oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.NativeTLS_Options.CipherSuites :=
'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:' +
'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:' +
'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA';
W kompilacji wykonanej z SGC_CRYPTO_FIPS obie grupy zbudowane na X25519, zestawy ChaCha20-Poly1305 oraz wymiana kluczy RSA są usuwane, a wartości domyślne zmieniają się na SecP256r1MLKEM768:SecP384r1MLKEM1024:secp256r1:secp384r1 oraz TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256, wraz z czterema zestawami ECDHE AES-GCM dla TLS 1.2. Zobacz Tryb FIPS.
Zachowanie TLS 1.2
TLS 1.2 jest zaimplementowany z zabezpieczeniami, jakich oczekuje współczesny partner, i bez tych części protokołu, które spowodowały jego znane ataki.
Rozszerzony sekret główny (extended master secret). RFC 7627 jest oferowany przez klienta i akceptowany przez serwer. Partner, który go nie obsługuje, wciąż jest akceptowany.
Brak renegocjacji. Żądanie renegocjacji jest odrzucane alertem no_renegotiation. Wznawianie sesji korzysta z biletów sesji i wymaga rozszerzonego sekretu głównego, zobacz Wznawianie sesji poniżej.
Brak podpisów SHA-1. Zgodnie z RFC 9155 podpisy SHA-1 nie są ani wysyłane, ani akceptowane. ClientHello TLS 1.2 bez rozszerzenia signature_algorithms jest odrzucane, ponieważ oznaczałoby wyłącznie SHA-1.
Ochrona przed degradacją wersji (downgrade). Ochrona przed degradacją z RFC 8446, sekcja 4.1.3, działa po obu stronach. Serwer, który dopuszcza również TLS 1.3, oznacza każdą odpowiedź TLS 1.2, a klient, który zaoferował TLS 1.3, odrzuca odpowiedź TLS 1.2 niosącą to oznaczenie.
Stałoczasowe CBC. Rekordy CBC są odszyfrowywane w stałym czasie, co zamyka lukę Lucky Thirteen, a wymiana kluczy RSA stosuje środek zaradczy z RFC 5246, sekcja 7.4.7.1.
Zastosowanie klucza certyfikatu (key usage). Dla wymiany kluczy RSA certyfikat serwera musi mieć zastosowanie klucza keyEncipherment. Zestawy ECDHE i TLS 1.3 wymagają digitalSignature.
Funkcje tylko dla TLS 1.3. KeyUpdate oraz eksportowanie materiału kluczowego istnieją wyłącznie w sesji TLS 1.3.
Wznawianie sesji
Silnik wznawia sesje za pomocą bezstanowych biletów sesji, w TLS 1.3 (RFC 8446) i w TLS 1.2 (RFC 5077). Po pełnym uzgadnianiu serwer wysyła bilet, zapieczętowany AES-256-GCM kluczem, który zna wyłącznie serwer. Klient trzyma go w pamięci podręcznej sesji, indeksowanej hostem, portem i listą ALPN, i oferuje go przy kolejnym połączeniu, które wtedy pomija wymianę certyfikatów. Bilet, którego serwer nie potrafi otworzyć, albo taki, który wygasł, daje pełne uzgadnianie z nowym biletem.
| Właściwość | Wartość domyślna | Znaczenie |
| NativeTLS_Options.SessionTickets | True | Serwer wydaje bilety, a klient je przechowuje i oferuje. False wyłącza wznawianie, każde uzgadnianie jest wtedy pełne. |
| NativeTLS_Options.TicketLifetime | 7200 | Tylko serwer. Liczba sekund, przez którą bilet może posłużyć do wznowienia, co najwyżej 604800. Klucz biletu serwera obraca się co TicketLifetime sekund, a poprzedni klucz pozostaje ważny przez jeszcze jeden okres. |
Opcje to TLSOptions.NativeTLS_Options po stronie klienta i SSLOptions.NativeTLS_Options po stronie serwera. Pamięć podręczna sesji należy do każdego komponentu klienckiego, więc ponowne połączenia tego samego TsgcWebSocketClient, TsgcHTTP1Client, TsgcTCPClient albo TsgcLDAPClient są wznawiane, tak samo jak połączenie nadrzędne (upstream) TsgcWebSocketProxyServer.
Wznowienie w TLS 1.2 wymaga rozszerzonego sekretu głównego z RFC 7627. Sesja TLS 1.2 bez niego nigdy nie jest wznawiana i nie dostaje biletu, a bilet nie jest wydawany również wtedy, gdy serwer żąda certyfikatu klienta. Bilet TLS 1.3 nigdy nie otwiera się jako sesja TLS 1.2, i odwrotnie.
Czy połączenie zostało wznowione, raportuje właściwość Resumed klasy TsgcIdSSLIOHandlerSocketNativeTLS, handlera opisanego poniżej.
Co zostało wynegocjowane
Po zakończeniu uzgadniania handler klienta, TsgcIdSSLIOHandlerSocketNativeTLS w jednostce sgcSSL_NativeTLS_Indy, raportuje wynik. VersionName to TLSv1.2 albo TLSv1.3, CipherSuiteName to nazwa IANA zestawu, GroupName to grupa wymiany kluczy, pusta dla wymiany kluczy RSA, a PeerSignatureSchemeName to schemat podpisu użyty przez serwer. Handler to ten, który klient przekazuje do OnSSLAfterCreateHandler.
procedure TForm1.oClientSSLAfterCreateHandler(Sender: TObject;
aType: TwsSSLHandler; aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
FHandler := aSSLHandler;
end;
procedure TForm1.oClientConnect(Connection: TsgcWSConnection);
var
oHandler: TsgcIdSSLIOHandlerSocketNativeTLS;
begin
if FHandler is TsgcIdSSLIOHandlerSocketNativeTLS then
begin
oHandler := TsgcIdSSLIOHandlerSocketNativeTLS(FHandler);
Memo1.Lines.Add(oHandler.VersionName + ' ' + oHandler.CipherSuiteName +
' ' + oHandler.GroupName + ' ' + oHandler.PeerSignatureSchemeName);
end;
end;
Certyfikaty i weryfikacja
Serwer odczytuje CertFile, KeyFile i Password. CertFile i KeyFile mogą być w formacie PEM, albo CertFile może być plikiem .pfx lub .p12, rozpoznawanym po rozszerzeniu. Plik PKCS#12 zawiera certyfikat, łańcuch i klucz prywatny, więc KeyFile nie jest potrzebny, a plik otwiera się za pomocą Password. Jest odczytywany przez czysto pascalowy czytnik PKCS#12 z sgcCrypto_PKCS12, bez OpenSSL. Klient, który ustawi VerifyCertificate na True, sprawdza łańcuch serwera wobec zaufanych certyfikatów głównych opisanych poniżej oraz sprawdza, czy nazwa zgadza się z hostem, z którym się połączył. VerifyDepth jest przekazywane dalej, a wartość powyżej 16 jest ograniczana do 16.
Zaufane certyfikaty główne to certyfikaty z RootCertFile. Ustawienie NativeTLS_Options.UseSystemRoots na True dodaje urzędy certyfikacji, którym ufa system operacyjny. Domyślnie ma wartość False. Obie listy się łączą: certyfikaty główne z RootCertFile są ładowane jako pierwsze, certyfikaty systemowe są dodawane do tego samego magazynu, a łańcuch jest akceptowany, gdy prowadzi do któregokolwiek z nich. Gdy nie znaleziono żadnego certyfikatu systemowego, nic nie jest dodawane i nie zgłasza się żaden błąd, więc weryfikacja opiera się wyłącznie na RootCertFile. Właściwość to TLSOptions.NativeTLS_Options.UseSystemRoots po stronie klienta i SSLOptions.NativeTLS_Options.UseSystemRoots po stronie serwera, gdzie certyfikaty główne służą wyłącznie do walidacji certyfikatów klienta. Skąd pochodzą certyfikaty systemowe, zależy od platformy:
Windows. Magazyn systemowy ROOT, Trusted Root Certification Authorities, odczytywany przez crypt32.dll.
macOS. Certyfikaty zakotwiczenia (anchor) z Security.framework, z /etc/ssl/cert.pem jako rezerwą.
iOS. Certyfikatów systemowych nie można wylistować. Gdy nie wczytano żadnego certyfikatu głównego, łańcuch odrzucany przez silnik wyłącznie z powodu niezaufanego certyfikatu głównego jest oceniany przez Security.framework z użyciem polityki SSL i nazwy hosta. Sprawdzenia zastosowania klucza i nazwy hosta silnika i tak są wykonywane później.
Android. Pliki certyfikatów z /apex/com.android.conscrypt/cacerts (Android 14 i nowsze) albo /system/etc/security/cacerts, w formacie PEM lub DER. Certyfikaty główne wyłączone przez użytkownika, wymienione w /data/misc/user/0/cacerts-removed, są pomijane, a certyfikaty główne użytkownika z /data/misc/user/0/cacerts-added są dodawane, gdy aplikacja ma dostęp do odczytu tych folderów.
Linux i inne platformy. Pierwszy z tych plików, który istnieje i zawiera co najmniej jeden certyfikat: /etc/ssl/certs/ca-certificates.crt, /etc/pki/tls/certs/ca-bundle.crt, /etc/ssl/ca-bundle.pem, /etc/pki/tls/cacert.pem, /etc/ssl/cert.pem oraz /etc/ssl/certs/ca-bundle.crt.
Aby samodzielnie wczytać folder plików certyfikatów, TsgcTLS13TrustStore.AddDirectory(aDirectory, aRemovedDirectory) w jednostce sgcSSL_NativeTLS_Certificates odczytuje każdy plik PEM lub DER z aDirectory, pomija każdy plik, którego nazwa istnieje też w aRemovedDirectory, i zwraca liczbę dodanych certyfikatów. Działa na każdej platformie.
Aby zamiast hosta połączenia wskazać nazwę, którą musi nieść certyfikat, ustaw TLSOptions.OpenSSL_Options.X509Checks.HostName albo IPAddress, wraz z odpowiednią flagą w X509Checks.Mode. Silnik odczytuje te dwie wartości, mimo że nie jest OpenSSL, więc właściwość znaczy to samo niezależnie od wybranego IOHandler.
Po stronie serwera SSLOptions.VerifyCertificate żąda od klienta certyfikatu i weryfikuje go wobec zaufanych certyfikatów głównych opisanych powyżej, a SSLOptions.VerifyCertificate_Options.FailIfNoCertificate odrzuca klienta, który żadnego nie przesyła. VerifyClientOnce nie ma tu nic do roboty. TLS 1.3 nie zna renegocjacji, a silnik odrzuca ją w TLS 1.2, więc nigdy nie pyta po raz drugi.
ALPN działa jak zwykle, przez ALPNProtocols po stronie klienta i przez wybór ALPN po stronie serwera, więc HTTP/2 na natywnym silniku negocjuje h2 tak samo jak na OpenSSL. Zobacz ALPN.
Tryb QUIC
Silnik uzgadnia również TLS 1.3 dla QUIC i HTTP/3 (RFC 9001). Ustaw SSLQUICOptions.IOHandler na TsgcQUICClient, TLSOptions.IOHandler na TsgcHTTP3Client, QUICOptions.SSLOptions.IOHandler na TsgcQUICServer i TsgcHTTP3Server, albo SSLOptions.IOHandler na serwerze z HTTP3Options.Enabled, na iohNativeTLS.
Zawsze używany jest sgc QUIC engine, niezależnie od tego, co eksportuje OpenSSL. Na serwerze QUICMode raportuje qmCustom.
Uzgadnianie niesie parametry transportowe QUIC, wymaga ALPN i raportuje alerty TLS jako kody błędów QUIC. Certyfikat serwera jest odczytywany z PEM albo PFX, a druga strona jest weryfikowana wobec RootCertFile albo certyfikatów systemowych, łącznie z nazwą hosta.
Bilety sesji, wznawianie i 0-RTT działają tak samo jak na OpenSSL. Serwer wysyła bilet po uzgadnianiu, klient przechowuje go razem z ALPN i parametrami transportowymi serwera, a 0-RTT jest akceptowane tylko raz na bilet. Bilety QUIC nigdy nie przechodzą do TLS przez TCP.
Ochrona pakietów też jest natywna, więc QUIC i HTTP/3 nie wczytują żadnego OpenSSL. Nie jest potrzebna żadna dyrektywa.
Zobacz QUIC po porównanie silników.
Czego silnik nie robi
Silnik jest celowo wąski. Wszystko poniżej jest rzeczywistym ograniczeniem, a nie ustawieniem, którego należy szukać.
Tylko TLS 1.3 i TLS 1.2. Nie ma SSL, nie ma TLS 1.0 ani TLS 1.1. Klient zgłasza wyjątek przy nawiązywaniu połączenia, a serwer przy starcie, jeśli Version ma wartość tls1_0 albo tls1_1. Druga strona, która nie obsługuje ani TLS 1.3, ani TLS 1.2, nie zdoła się połączyć.
Brak PSK bez biletu. Wznawianie działa wyłącznie z biletami sesji wydawanymi przez sam silnik, zobacz Wznawianie sesji powyżej. Zewnętrzne klucze wstępnie współdzielone (pre-shared keys) nie są obsługiwane.
Brak 0-RTT przez TCP. W połączeniu TLS przez TCP wczesne dane nie są ani wysyłane, ani przyjmowane. Uwierzytelnianie klienta po uzgadnianiu również nie jest zaimplementowane.
QUIC we własnym trybie. QUIC i HTTP/3 korzystają z trybu QUIC opisanego powyżej, konfigurowanego na tych komponentach.
Brak certyfikatów systemowych domyślnie. Jeśli NativeTLS_Options.UseSystemRoots nie ma wartości True, zaufane certyfikaty główne pochodzą wyłącznie z RootCertFile i znikąd indziej, więc klient, który weryfikuje certyfikaty, musi dostarczyć plik z certyfikatami głównymi albo na niego wskazać. To jedyna różnica w zachowaniu, którą najpewniej zauważy działająca konfiguracja OpenSSL albo SChannel.
Zdarzenie OnSSLVerifyPeer nie jest zgłaszane. To zdarzenie należy do handlera OpenSSL. Natywny silnik ma własne punkty zaczepienia weryfikacji, które otrzymują cały łańcuch drugiej strony i werdykt silnika naraz, zamiast jednego certyfikatu na poziom, więc aplikacja, która nadpisuje decyzję o zaufaniu, musi używać ich, a nie zdarzenia komponentu.
Nic, co przyśle druga strona, nie zgłasza wyjątku. Awaria protokołu kończy połączenie właściwym alertem TLS, a przyczyna jest raportowana przez zdarzenia błędów komponentu, jak zwykle.
Ochrona rekordów AES-GCM i AES-CBC korzysta z instrukcji AES-NI i PCLMULQDQ w kompilacjach Windows tworzonych w Delphi, gdy dysponuje nimi procesor, zobacz sgcAES_HardwareAvailable w Szyfrowanie symetryczne. Dla kompilacji, w której żadna część biblioteki nie wczytuje OpenSSL, zobacz Praca bez OpenSSL.