TsgcWebSocketProxyServer › Proprietà › SSLOptions
Contiene i percorsi dei certificati, la selezione della versione TLS e la configurazione di OpenSSL per il listener TLS downstream.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Fornire il materiale del certificato prima di attivare il proxy quando SSL è True: RootCertFile, CertFile e KeyFile puntano a file PEM (utilizzare lo stesso percorso per tutti e tre quando il file contiene la catena completa), e Password è necessaria solo se la chiave privata è cifrata. Impostare VerifyCertificate su True per richiedere e validare i certificati client (le sotto-opzioni FailIfNoCertificate e VerifyClientOnce affinano il controllo) con VerifyDepth che controlla la lunghezza della catena. Version seleziona una versione TLS specifica (tls1_0, tls1_1, tls1_2, tls1_3) o lascia aperta la negoziazione (tlsUndefined). Con iohNativeTLS è invece la versione minima consentita, vedere sotto. OpenSSL_Options espone controlli di basso livello: APIVersion (oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), LibPath/LibPathCustom per individuare i binari OpenSSL, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin e X509Checks per la validazione di hostname/IP. Queste impostazioni si applicano solo al ramo downstream; il ramo TLS upstream è abilitato tramite Proxy.TLS.
IOHandler seleziona il motore TLS. iohOpenSSL è il predefinito e iohSChannel utilizza il provider di Windows. iohNativeTLS seleziona il motore TLS scritto interamente in Object Pascal del pack sgcCrypto, che parla TLS 1.3 e TLS 1.2: non viene caricata alcuna libreria OpenSSL e in TLS 1.3 i gruppi ibridi di scambio di chiavi post-quantistico della RFC 10024 vengono offerti con X25519MLKEM768 al primo posto. Le sue 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. Il motore funziona sia con il classico modello a un thread per connessione sia con i motori IOCP ed EPOLL. iohAppleTLS e iohAndroidTLS sono handler solo client: un server con uno di essi genera un'eccezione quando Active viene impostato su True, a meno che OnSSLGetHandler non fornisca un proprio handler. Utilizzare invece iohNativeTLS, iohOpenSSL o, su Windows, iohSChannel.
Per il motore nativo, Version è la versione minima consentita, non una versione esatta come con iohOpenSSL. tlsUndefined (il valore predefinito) e tls1_2 accettano TLS 1.3 e TLS 1.2, tls1_3 accetta solo TLS 1.3, e tls1_0 o tls1_1 generano un errore di configurazione all'avvio del server, perché il motore supporta solo TLS 1.2 e TLS 1.3. Per accettare 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 valida i certificati client rispetto alle radici in RootCertFile, oltre alle radici di cui si fida il sistema operativo quando NativeTLS_Options.UseSystemRoots è True (False per impostazione predefinita). Con iohNativeTLS, CertFile può anche essere un file .pfx o .p12 che contiene il certificato, la catena e la chiave, aperto con Password. Il motore riprende le sessioni con i session ticket di TLS 1.3 e TLS 1.2: NativeTLS_Options.SessionTickets (True per impostazione predefinita) li attiva e NativeTLS_Options.TicketLifetime (7200 secondi per impostazione predefinita) imposta per quanto tempo un ticket può essere utilizzato. La ripresa in TLS 1.2 richiede che il client supporti l'extended master secret. Non accetta 0-RTT e non genera OnSSLVerifyPeer, che appartiene all'handler OpenSSL. VerifyCertificate chiede al client un certificato e lo valida, VerifyCertificate_Options.FailIfNoCertificate rifiuta un client che non ne invia alcuno, e VerifyClientOnce non ha alcun effetto perché il motore non rinegozia mai. Vedere TLS nativo.
oProxy := TsgcWebSocketProxyServer.Create(nil);
oProxy.SSL := true;
oProxy.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.Version := tls1_3;
oProxy.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oProxy.SSLOptions.Port := 443;
oProxy.Proxy.Host := 'upstream.example.com';
oProxy.Proxy.Port := 8080;
oProxy.Active := true;