TsgcWebSocketClient › Proprietà › TLSOptions
Configura certificati, versione TLS, ALPN, IOHandler e altri dettagli di connessione sicura utilizzati quando TLS è abilitato.
property TLSOptions: TsgcWSTLS_Options read FTLSOptions write SetTLSOptions;
Preset=tlspCustom
Accessibile solo quando TLS è True. Le sotto-proprietà includono RootCertFile, CertFile, KeyFile, Password, VerifyCertificate, VerifyDepth, Version (da tlsUndefined fino a tls1_3), ALPNProtocols e IOHandler (iohOpenSSL, iohSChannel, iohAndroidTLS, iohAppleTLS o iohNativeTLS). Su Android, iohAndroidTLS utilizza il TLS nativo della piattaforma (javax.net.ssl.SSLEngine) e su iOS e macOS, iohAppleTLS utilizza il TLS nativo di Apple, quindi non è necessario distribuire alcuna libreria OpenSSL; il TLS nativo della piattaforma richiede l'edizione Enterprise. Le impostazioni specifiche di OpenSSL si trovano in OpenSSL_Options e quelle specifiche di SChannel in SChannel_Options.
VerifyCertificate controlla la verifica del certificato allo stesso modo per ogni IOHandler, incluso iohSChannel: il valore predefinito è False, quindi un server che presenta un certificato autofirmato, scaduto o con un hostname errato viene accettato senza alcun avviso finché non viene impostato su True. Con SChannel, la verifica viene quindi eseguita rispetto allo store di certificati di Windows; OnSChannelVerifyPeer consente all'applicazione di ispezionare la catena o di accettare un certificato che altrimenti verrebbe rifiutato.
VerifyCertificate non dice nulla sul fatto che il certificato sia stato revocato dopo la sua emissione, quindi una chiave rubata il cui certificato è stato revocato ma non è ancora scaduto continua ad autenticarsi. Con iohSChannel, lo stato di revoca viene verificato solo quando SChannel_Options.Revocation.Check è impostato su un valore diverso da scrcDisabled (il predefinito): scrcEndCertificate verifica solo il certificato del server, scrcChainExcludeRoot lo verifica insieme ai certificati intermedi e scrcChain include anche la radice. Revocation.Timeout limita l'intero recupero di CRL e OCSP (5000 ms per impostazione predefinita) in modo che un responder irraggiungibile non possa bloccare l'handshake, Revocation.CacheOnly utilizza solo ciò che Windows ha già presente nella cache e non accede mai alla rete, e Revocation.IgnoreRevocationOffline e Revocation.IgnoreNoRevocationCheck (entrambe True) decidono se accettare un responder irraggiungibile o un certificato che non pubblica informazioni di revoca. Un certificato confermato revocato viene sempre rifiutato. Vedere SChannel Certificate Revocation.
Preset applica un insieme di impostazioni predefinite sicure in un'unica assegnazione. Con tlspCustom (predefinito) ogni opzione mantiene il valore configurato manualmente, preservando il comportamento precedente. Impostando Preset := tlspSecureDefaults si abilita la verifica del certificato (VerifyCertificate := True), si eleva Version a TLS 1.2 solo quando era impostata su tls1_0 o tls1_1 (tlsUndefined viene lasciata com'è, quindi TLS 1.3 resta disponibile), si imposta OpenSSL_Options.VersionMin e SChannel_Options.VersionMin su tls1_2 quando erano inferiori o non definite, si abilita il controllo del nome host del certificato del server (validazione hostname X509Checks di OpenSSL) e si abilita il controllo di revoca SChannel come scrcChainExcludeRoot. Le singole opzioni possono ancora essere regolate dopo l'applicazione del preset.
IOHandler accetta anche iohNativeTLS, il motore TLS scritto interamente in Object Pascal del pack sgcCrypto, che parla TLS 1.3 e TLS 1.2. Non carica alcuna libreria OpenSSL e in TLS 1.3 offre i gruppi ibridi di scambio di chiavi post-quantistico della RFC 10024, con X25519MLKEM768 al primo posto, quindi un client che lo seleziona negozia uno scambio di chiavi post-quantistico con qualsiasi server che ne supporti uno. Le due liste di preferenza sono NativeTLS_Options.Groups e NativeTLS_Options.CipherSuites, separate da due punti nello stile OpenSSL, e una lista vuota mantiene i valori predefiniti del motore.
Per il motore nativo, Version è la versione minima consentita, non una versione esatta come con iohOpenSSL. tlsUndefined (il valore predefinito) e tls1_2 negoziano TLS 1.3 o TLS 1.2, tls1_3 negozia solo TLS 1.3, e tls1_0 o tls1_1 generano un errore di configurazione alla connessione, perché il motore supporta solo TLS 1.2 e TLS 1.3. Per il solo TLS 1.2, indicare solo suite TLS 1.2, come TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, in NativeTLS_Options.CipherSuites. Il motore si fida delle radici in RootCertFile, e NativeTLS_Options.UseSystemRoots (False per impostazione predefinita) aggiunge le radici di cui si fida il sistema operativo: lo store di certificati ROOT di Windows, i certificati di ancoraggio di Security.framework su macOS (con /etc/ssl/cert.pem come ripiego), una valutazione della catena del peer tramite Security.framework su iOS, la cartella Conscrypt o /system/etc/security/cacerts su Android, e su Linux il primo file di bundle CA trovato tra sei posizioni standard, a partire da /etc/ssl/certs/ca-certificates.crt. Quando non si trova alcuna radice di sistema, VerifyCertificate := True richiede un file di radici. CertFile può anche essere un file .pfx o .p12, aperto con Password. Il motore riprende le sessioni con i session ticket di TLS 1.3 e TLS 1.2, conservati in una cache di sessione del componente, così una riconnessione salta l'handshake completo. NativeTLS_Options.SessionTickets (True per impostazione predefinita) attiva questo comportamento, e la ripresa in TLS 1.2 richiede che il server supporti l'extended master secret. Non invia dati 0-RTT e non genera OnSSLVerifyPeer, che appartiene all'handler OpenSSL. Per fissare il nome che il certificato deve riportare, impostare OpenSSL_Options.X509Checks.HostName o IPAddress, che anche il motore nativo legge. Vedere TLS nativo.
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;