Draaien zonder OpenSSL

sgcWebSockets kan volledig zonder OpenSSL-bibliotheek draaien. Twee onafhankelijke instellingen maken dat mogelijk, en beide zijn gebouwd op de pure Pascal sgcCrypto-units, die vanaf de Standard-editie worden meegeleverd.

Een applicatie die noch OpenSSL voor haar verbindingen, noch voor haar overige cryptografie nodig heeft, gebruikt beide.

1. Runtimeschakelaar: sgcCryptoBackend

De unit sgcBase_Helpers declareert de globale variabele sgcCryptoBackend van het type TsgcCryptoBackend:

De schakelaar is globaal, niet per component. Stel deze eenmalig in bij het opstarten, voordat er componenten worden aangemaakt. sgcUseNativeCrypto geeft True terug wanneer de native backend wordt gebruikt. De native backend vereist dat de sgcCrypto-units zijn meegecompileerd (SGC_CRYPTO). Zonder deze geeft cbNative de uitzondering "Native crypto not available, sgcCrypto units are not compiled in". Roep sgcCheckNativeCrypto aan om deze fout al bij het opstarten te krijgen in plaats van bij het eerste gebruik.

uses
  sgcBase_Helpers;

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

Deze onderdelen volgen de schakelaar:

Gebied Wat native draait
Hash- en HMAC-hulpfuncties De hash- en HMAC-functies van sgcBase_Helpers, en sgcEncryptString / sgcDecryptString.
JWT, JWS-handtekeningen HMAC-, RSA-, RSA-PSS-, ECDSA- en EdDSA-ondertekening en -verificatie (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey werkt alleen op een OpenSSL-sleutel en geeft een fout op de native backend.
Certificaten De sgcSSL-hulpfuncties: PEM- en DER-conversie, certificaat laden, CRL-URI en certificaatketenverificatie.
OAuth2 en DPoP De OAuth2 JWK-hulpfunctie, en de DPoP-proofcontrole van de OAuth2-server (ES256, ES384, ES512, RS256, RS384, RS512). Zie DPoP.
Amazon AWS Signature V4, de CloudFront signed URL, en de Signature V4-authenticatie van de Amazon IoT MQTT-client, waarvan SignatureV4.OpenSSL_Options dan wordt genegeerd.
Web Push Het VAPID ES256-token, de ECDH-sleuteluitwisseling, HKDF en de AES-128-GCM-payloadversleuteling. Alleen een https-verbinding naar de pushdienst laadt een TLS-bibliotheek, via de eigen IOHandler.
E2EE Sleuteluitwisseling, AES-GCM en de random-generator. De publieke sleutels gaan op beide backends als PEM over de lijn, raw sleutels worden nog steeds geaccepteerd, zodat peers op verschillende backends onderling werken.
WebAuthn, SAML, OIDC De WebAuthn-certificaat-, COSE-sleutel- en attestatiecontroles, en de XMLDSig-handtekeningcontrole die door SAML en OIDC wordt gebruikt.
NTLM De MD4- en DES-code van NTLM-authenticatie. Deze is native in elke build en heeft geen define meer nodig.
AEAD, KEM, HKDF sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 en ECDH P-256) en sgcSSL_HKDF (nu ook met sgcHKDF_MD_SHA384). ML-KEM-768 heeft geen OpenSSL 3.5 nodig, en de sleutels gebruiken dezelfde coderingen als OpenSSL 3.5. In een FIPS-build is ChaCha20-Poly1305 niet beschikbaar en geeft het een fout.
QUIC, DTLS, SRTP Pakketbescherming van QUIC, het DTLS-certificaat en SRTP. Met iohNativeTLS zijn deze al native per verbinding, ongeacht wat de schakelaar zegt.

sgcCryptoBackend wijzigt de TLS-verbinding van een component niet. Een component die IOHandler = iohOpenSSL behoudt, laadt nog steeds OpenSSL wanneer deze verbinding maakt.

2. Optionele define: SGC_NATIVE_CRYPTO

De define staat standaard uit en is niet langer nodig om zonder OpenSSL te draaien. Zonder de define worden zowel de OpenSSL- als de native code meegecompileerd en beslist sgcCryptoBackend tijdens de uitvoering. Met de define wordt de native backend afgedwongen, ongeacht wat sgcCryptoBackend zegt, en wordt de OpenSSL-code uit de applicatiecryptografie-units verwijderd, zodat de executable kleiner is. Om deze in te schakelen, opent u sgcVer.inc en verwijdert u de punt uit de regel

{.$DEFINE SGC_NATIVE_CRYPTO}

of voegt u SGC_NATIVE_CRYPTO toe aan de voorwaardelijke definities van uw project. SGC_NATIVE_CRYPTO schakelt ook SGC_CRYPTO in, de sgcCrypto-units die het nodig heeft. DISABLE_SGC_NATIVE_CRYPTO schakelt het weer uit.

3. Nul OpenSSL tijdens uitvoering

Welke instellingen u nodig heeft, hangt af van wat de applicatie gebruikt:

Gebied Instellingen voor geen OpenSSL
TLS over TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT en de andere protocollen TLSOptions.IOHandler (client) of SSLOptions.IOHandler (server) = iohNativeTLS. Zie Native TLS.
QUIC en HTTP/3 IOHandler = iohNativeTLS. De handshake, de pakketbescherming, de sleutelvernieuwing en de Retry-tag zijn allemaal native. Zie QUIC en HTTP/3.
DTLS en WebRTC DTLSOptions.IOHandler = iohNativeTLS. De handshake, het DTLS-certificaat en de SRTP-sleutels zijn native. Zie DTLSOptions en WebRTC DTLS.
Applicatiecryptografie: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML en de andere gebieden van de eerste tabel sgcCryptoBackend := cbNative bij het opstarten, of de SGC_NATIVE_CRYPTO-define.

De iohNativeTLS-rijen hebben geen define en geen sgcCryptoBackend-instelling nodig. Het selecteren van iohNativeTLS in een build zonder de sgcCrypto-units geeft een uitzondering, het valt nooit stilzwijgend terug op OpenSSL.

iohNativeTLS

Met iohNativeTLS draaien de TLS 1.3- en TLS 1.2-handshake en de recordlaag op de native engine. Het werkt voor de WebSocket-, HTTP/1-, HTTP/2- en TCP-clients en -servers, en voor alles dat daarop is gebouwd: MQTT, AMQP, STOMP en de andere protocollen, de API-componenten, de IoT-clients (Certificate.IOHandler), de upstream-verbinding van de proxyserver (Proxy.TLSOptions) en de LDAP-client. Het certificaat mag PEM, DER of een .pfx-/.p12-bestand zijn.