TsgcWebSocketHTTPServer › 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. Password viene letta anche dal listener HTTP/3 abilitato tramite HTTP3Options, quindi lo stesso file di chiave cifrata serve entrambi i listener. 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.
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 := TsgcWebSocketHTTPServer.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;