TsgcWebSocketServer › Properties › SSLOptions
Contiene i percorsi dei certificati, la selezione della versione TLS e le impostazioni di ottimizzazione di OpenSSL per il listener TLS.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Fornire il materiale del certificato prima di attivare il server 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 la negoziazione aperta (tlsUndefined). Con iohNativeTLS è invece la versione minima consentita, vedere sotto. OpenSSL_Options espone parametri 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.
VerifyCertificate non dice nulla sul fatto che il certificato client sia stato revocato dopo la sua emissione, quindi un certificato la cui chiave è stata rubata e il cui numero di serie è stato nel frattempo revocato continua ad aprire una sessione fino alla scadenza. Con IOHandler=iohSChannel, lo stato di revoca del certificato client viene verificato solo quando SChannel_Options.Revocation.Check è impostato su un valore diverso da scrcDisabled (il predefinito): scrcEndCertificate verifica solo il certificato client, 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 client che non pubblica informazioni di revoca. Un certificato confermato revocato viene sempre rifiutato. Impostando Preset := tlspSecureDefaults si abilita il controllo come scrcChainExcludeRoot e si mantengono entrambe le impostazioni soft-fail, quindi un client che prima veniva ammesso continua a essere ammesso. Vedere Server SSL | Revoca del certificato client con SChannel.
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.
AllowPlainText (False per impostazione predefinita) permette al listener TLS di accettare anche connessioni HTTP e WebSocket in chiaro sulla stessa porta. Il server legge in anteprima il primo byte di ogni nuova connessione: $16 (record di handshake TLS) indica TLS, qualsiasi altro byte viene gestito come testo in chiaro, e quando non arriva nessun byte entro PlainTextTimeout (millisecondi, 5000 per impostazione predefinita) la connessione viene trattata come TLS. PlainTextPolicy decide cosa succede a una connessione in chiaro: ptpServe (il valore predefinito) serve normalmente la richiesta, ptpRedirect risponde 308 Permanent Redirect a https://<Host><path>, mantenendo il metodo e il corpo (400 Bad Request quando la richiesta non ha l'header Host), e ptpReject risponde 400 Bad Request e chiude la connessione. La proprietà di connessione TLS di TsgcWSConnectionServer indica se una connessione usa TLS. Queste opzioni funzionano con l'IOHandler Indy predefinito e con gli IOHandler IOCP ed EPOLL. All'interno di OnCommandGet, il metodo del server IsTLS(AContext) indica se la richiesta usa TLS. Vedere TLS e HTTP in chiaro sulla stessa porta.
oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;