Delphi TLS 1.3 bez DLL-i OpenSSL

· Komponenty
Delphi TLS 1.3 bez DLL-i OpenSSL

Każdy developer Delphi, który kiedykolwiek dostarczył TLS, zna tę rutynę. Jaką wersję OpenSSL ma ta maszyna. Dlaczego serwer klienta ma wersję 1.1, a maszyna budująca ma 3.0. Które dwa pliki DLL mają leżeć obok pliku wykonywalnego i co się dzieje, gdy antywirus usunie jeden z nich. sgcWebSockets 2026.10 daje wyjście: silnik TLS 1.3 napisany w Object Pascal, wbudowany w bibliotekę, bez żadnego DLL.

To prawdziwa implementacja, a nie wrapper: handshake, warstwa rekordów, key schedule i walidacja certyfikatów są w całości napisane w Pascalu. Klient albo serwer mówi TLS bez niczego zainstalowanego.

Jedna właściwość

oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.Active := True;

Na serwerze to ten sam przełącznik w SSLOptions:

oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.CertFile := 'server.pem';
oServer.SSLOptions.KeyFile := 'server.key';
oServer.SSL := True;

ALPN, S N I i certyfikaty klienckie są dostępne, zarówno w handlerze Indy, jak i na serwerach I O C P oraz E P O L L. Reszta Twojego kodu się nie zmienia.

Zaufanie do tego, czemu maszyna już ufa

Klient TLS jest tak dobry, jak jego kotwice zaufania, a dostarczanie cacert.pem, który się starzeje, to osobny problem utrzymaniowy. Silnik może użyć korzeni, którym system operacyjny już ufa:

oClient.TLSOptions.NativeTLS_Options.UseSystemRoots := True;

Na Windows pochodzą one z systemowego magazynu ROOT, na Linuksie i Androidzie z pierwszego znalezionego pakietu certyfikatów spośród typowych lokalizacji. Domyślnie jest to wyłączone, co utrzymuje kotwice zaufania dokładnie takimi, jakie wskazuje RootCertFile.

Postkwantowo już dziś, z powodu jutra

Atakujący, który nie potrafi dziś złamać Twojej sesji TLS, wciąż może ją nagrać i zachować. Ciekawe pytanie nie brzmi, czy komputer kwantowy istnieje już teraz, tylko jak długo Twój ruch pozostaje wrażliwy. Dlatego TLS przechodzi na hybrydową wymianę kluczy, w której współdzielony sekret jest bezpieczny, dopóki utrzymuje się choćby jedna z dwóch połówek.

Silnik negocjuje grupy hybrydowe z RFC 10024, a domyślna lista grup już zaczyna się od hybrydowej:

oClient.TLSOptions.NativeTLS_Options.Groups :=
  'X25519MLKEM768:SecP256r1MLKEM768:X25519';

Trzy hybrydy to X25519MLKEM768, SecP256r1MLKEM768 i SecP384r1MLKEM1024. Obie listy przyjmują nazwy w stylu OpenSSL rozdzielone dwukropkami, a pusta wartość zachowuje domyślne ustawienia silnika.

Kryptografia, która za tym stoi

Ta sama wersja dodaje same prymitywy postkwantowe do paczki sgcCrypto, w Object Pascal, bez żadnej zewnętrznej biblioteki:

Są one walidowane względem znanych wektorów odpowiedzi NIST, które są dostarczane z biblioteką jako zestaw testów, a nie jako deklaracja.

Wzmocnienie, o które nie musisz prosić

Ta sama poprawka wzmocniła klasyczną stronę przeciwko atakom czasowym. Operacje na prywatnym kluczu RSA używają blindingu i potęgowania w czasie stałym z weryfikacją wyniku, mnożenie skalarne na krzywych eliptycznych i podpisywanie Ed25519 działają w czasie stałym, a AES i GHASH nie indeksują już tabeli bajtami tajnymi. Klucze prywatne są sprawdzane przy imporcie, więc klucz, który nie należy do swojego certyfikatu, jest odrzucany zamiast produkować podpisy, których nikt nie może zweryfikować, a podpis, którego kodowanie ASN.1 nie jest minimalnym DER, jest teraz odrzucany zamiast akceptowany.

Kiedy czego używać

OpenSSL i SChannel nigdzie się nie wybierają i dla wielu aplikacji pozostają właściwą odpowiedzią: OpenSSL, jeśli potrzebujesz interoperacyjności TLS 1.2 z czymś starym, SChannel, jeśli polityka klienta zakłada, że to Windows posiada kryptografię. Natywny silnik jest dla przypadku, w którym problemem jest wdrożenie: pojedynczy plik wykonywalny, bez żadnego DLL obok, to samo zachowanie na Windows i na Linuksie, oraz postkwantowa wymiana kluczy bez czekania, aż nadrobi to platforma.

Aktualizacja

Silnik jest częścią paczki sgcCrypto i wybiera się go dla każdego komponentu osobno, więc nic się nie zmienia, dopóki nie ustawisz IOHandler. Build bez jednostek kryptograficznych zgłasza czytelny komunikat zamiast zawodzić w niejasny sposób podczas handshake'u.

Czytaj dalej

Zobacz wideo

Jest na ten temat krótkie wideo na kanale eSeGeCe.

Pytania, uwagi lub pomoc przy migracji? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.