Praca bez OpenSSL

sgcWebSockets może działać całkowicie bez biblioteki OpenSSL. Umożliwiają to dwa niezależne ustawienia, oba oparte na jednostkach sgcCrypto napisanych w czystym Pascalu, dostępnych od edycji Standard.

Aplikacja, która nie potrzebuje OpenSSL ani dla swoich połączeń, ani dla pozostałej kryptografii, używa obu.

1. Przełącznik czasu działania: sgcCryptoBackend

Jednostka sgcBase_Helpers deklaruje globalną zmienną sgcCryptoBackend typu TsgcCryptoBackend:

Przełącznik jest globalny, nie dotyczy pojedynczego komponentu. Ustaw go raz przy starcie, przed utworzeniem jakiegokolwiek komponentu. sgcUseNativeCrypto zwraca True, gdy używany jest backend natywny. Backend natywny wymaga skompilowanych jednostek sgcCrypto (SGC_CRYPTO). Bez nich cbNative zgłasza wyjątek "Native crypto not available, sgcCrypto units are not compiled in". Wywołaj sgcCheckNativeCrypto, aby otrzymać ten błąd już przy starcie, zamiast przy pierwszym użyciu.

uses
  sgcBase_Helpers;

begin
  sgcCryptoBackend := cbNative;
  sgcCheckNativeCrypto;
  Application.Initialize;
  ...

Te części stosują się do przełącznika:

Obszar Co działa natywnie
Funkcje skrótu i HMAC Funkcje skrótu i HMAC z sgcBase_Helpers oraz sgcEncryptString / sgcDecryptString.
Podpisy JWT, JWS Podpisywanie i weryfikacja HMAC, RSA, RSA-PSS, ECDSA i EdDSA (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey działa wyłącznie z kluczem OpenSSL i zgłasza błąd na backendzie natywnym.
Certyfikaty Funkcje pomocnicze sgcSSL: konwersja PEM i DER, wczytywanie certyfikatów, URI CRL i weryfikacja łańcucha certyfikatów.
OAuth2 i DPoP Funkcja pomocnicza JWK OAuth2 oraz weryfikacja dowodów DPoP serwera OAuth2 (ES256, ES384, ES512, RS256, RS384, RS512). Zobacz DPoP.
Amazon AWS Signature V4, podpisany URL CloudFront oraz uwierzytelnianie Signature V4 klienta MQTT Amazon IoT, którego SignatureV4.OpenSSL_Options są wtedy ignorowane.
Web Push Token VAPID ES256, uzgadnianie kluczy ECDH, HKDF i szyfrowanie ładunku AES-128-GCM. Tylko połączenie https z usługą push wczytuje bibliotekę TLS, przez swój IOHandler.
E2EE Uzgadnianie kluczy, AES-GCM i generator liczb losowych. Klucze publiczne są przesyłane jako PEM na obu backendach, surowe klucze są nadal akceptowane, więc partnerzy na różnych backendach są ze sobą zgodni.
WebAuthn, SAML, OIDC Weryfikacja certyfikatu WebAuthn, klucza COSE i atestacji, oraz weryfikacja podpisu XMLDSig używana przez SAML i OIDC.
NTLM Kod MD4 i DES uwierzytelniania NTLM. Jest natywny w każdej kompilacji i nie wymaga już żadnej definicji.
AEAD, KEM, HKDF sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 i ECDH P-256) oraz sgcSSL_HKDF (teraz również z sgcHKDF_MD_SHA384). ML-KEM-768 nie wymaga OpenSSL 3.5, a klucze używają tych samych kodowań co OpenSSL 3.5. W kompilacji FIPS ChaCha20-Poly1305 jest niedostępne i zgłasza błąd.
QUIC, DTLS, SRTP Ochrona pakietów QUIC, certyfikat DTLS i SRTP. Z iohNativeTLS są już natywne dla danego połączenia, niezależnie od ustawienia przełącznika.

sgcCryptoBackend nie zmienia połączenia TLS komponentu. Komponent, który zachowuje IOHandler = iohOpenSSL, nadal wczytuje OpenSSL przy łączeniu.

2. Opcjonalna definicja: SGC_NATIVE_CRYPTO

Definicja jest domyślnie wyłączona i nie jest już potrzebna do pracy bez OpenSSL. Bez niej kompilowany jest zarówno kod OpenSSL, jak i kod natywny, a o wyborze w czasie działania decyduje sgcCryptoBackend. Z nią backend natywny jest wymuszony niezależnie od ustawienia sgcCryptoBackend, a kod OpenSSL jest usuwany z jednostek kryptografii aplikacji, dzięki czemu plik wykonywalny jest mniejszy. Aby ją włączyć, otwórz sgcVer.inc i usuń kropkę z linii

{.$DEFINE SGC_NATIVE_CRYPTO}

lub dodaj SGC_NATIVE_CRYPTO do warunkowych definicji swojego projektu. SGC_NATIVE_CRYPTO włącza też SGC_CRYPTO, potrzebne jednostki sgcCrypto. DISABLE_SGC_NATIVE_CRYPTO wyłącza ją ponownie.

3. Zero OpenSSL w czasie działania

Potrzebne ustawienia zależą od tego, czego używa aplikacja:

Obszar Ustawienia bez OpenSSL
TLS przez TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT i pozostałe protokoły TLSOptions.IOHandler (klient) lub SSLOptions.IOHandler (serwer) = iohNativeTLS. Zobacz Natywne TLS.
QUIC i HTTP/3 IOHandler = iohNativeTLS. Uzgadnianie, ochrona pakietów, aktualizacja kluczy i znacznik Retry są w pełni natywne. Zobacz QUIC i HTTP/3.
DTLS i WebRTC DTLSOptions.IOHandler = iohNativeTLS. Uzgadnianie, certyfikat DTLS i klucze SRTP są natywne. Zobacz DTLSOptions i DTLS w WebRTC.
Kryptografia aplikacji: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML i pozostałe obszary z pierwszej tabeli sgcCryptoBackend := cbNative przy starcie, albo definicja SGC_NATIVE_CRYPTO.

Wiersze dotyczące iohNativeTLS nie wymagają żadnej definicji ani ustawienia sgcCryptoBackend. Wybranie iohNativeTLS w kompilacji bez jednostek sgcCrypto zgłasza wyjątek, nigdy nie przechodzi po cichu na OpenSSL.

iohNativeTLS

Z iohNativeTLS uzgadnianie TLS 1.3 i TLS 1.2 oraz warstwa rekordów działają na silniku natywnym. Działa to dla klientów i serwerów WebSocket, HTTP/1, HTTP/2 i TCP oraz dla wszystkiego, co jest na nich zbudowane: MQTT, AMQP, STOMP i pozostałych protokołów, komponentów API, klientów IoT (Certificate.IOHandler), połączenia nadrzędnego serwera proxy (Proxy.TLSOptions) oraz klienta LDAP. Certyfikat może być w formacie PEM, DER lub pliku .pfx / .p12.