Server SSL | SChannel per server Indy

I componenti server basati su Indy (TsgcWebSocketServer, TsgcWebSocketHTTPServer) possono utilizzare Windows SChannel (Secure Channel) come provider TLS invece di OpenSSL. SChannel è l'implementazione TLS nativa di Windows, quindi non richiede alcuna DLL esterna.

Come funziona

Quando un componente server ha SSL abilitato e l'IOHandler è impostato su iohSChannel, il server crea un'istanza di TsgcIdServerIOHandlerSSLSChannel che gestisce tutte le operazioni TLS tramite l'API Windows SChannel. Per ogni connessione client in entrata, il server esegue l'handshake TLS tramite il provider SChannel, negoziando la versione del protocollo, la suite di cifratura e associando il certificato configurato.

SChannel legge i certificati dal Windows Certificate Store o da un file PFX (.pfx / .p12). Non sono necessari file PEM e non è necessario distribuire librerie OpenSSL.

Configurazione

Per abilitare SChannel su un server Indy, configuri le seguenti proprietà:

1. Impostare la proprietà SSL su True.

2. Impostare SSLOptions.IOHandler su iohSChannel.

3. Imposti SSLOptions.Version alla versione TLS desiderata (tls1_2, tls1_3, ...).

4. Impostare SSLOptions.Port sulla porta utilizzata per le connessioni sicure.

5. Configurare il certificato utilizzando uno dei due metodi descritti di seguito.

Proprietà di SChannel_Options

La sotto-proprietà SSLOptions.SChannel_Options espone le impostazioni specifiche di SChannel:

Proprietà Descrizione
CertHash L'impronta digitale (hash esadecimale) di un certificato installato nell'archivio certificati di Windows.
CertStoreName Quale archivio di certificati cercare: scsnMY (Personale), scsnRoot, scsnTrust, scsnCA.
CertStorePath Posizione dell'archivio: scspStoreLocalMachine o scspStoreCurrentUser.
CipherList Elenco facoltativo separato da due punti di algoritmi di cifratura (ad es. CALG_AES_256:CALG_AES_128). Vuoto significa utilizzare le impostazioni predefinite del sistema.
UseLegacyCredentials Se True, utilizza la struttura SCHANNEL_CRED legacy invece di SCH_CREDENTIALS. Abilitare questa opzione per le versioni precedenti di Windows che non supportano la nuova API.
Revocation.Check Quale parte della catena di certificati del client viene sottoposta alla verifica dello stato di revoca: scrcDisabled (predefinito), scrcEndCertificate, scrcChainExcludeRoot o scrcChain.
Revocation.Timeout Millisecondi consentiti per l'intero recupero di CRL e OCSP, non per singolo URL. Il valore predefinito è 5000. Zero lascia in vigore l'impostazione predefinita di Windows, che può essere molto più lunga.
Revocation.CacheOnly Se True, vengono utilizzati solo i dati di revoca già presenti nella cache di Windows e l'handshake non accede mai alla rete. Il valore predefinito è False.
Revocation.IgnoreRevocationOffline Accetta il certificato client quando non è stato possibile raggiungere il responder, il comportamento soft-fail. Il valore predefinito è True. False lo rifiuta.
Revocation.IgnoreNoRevocationCheck Accetta un certificato client che non pubblica alcun punto di distribuzione CRL né alcun responder OCSP. Il valore predefinito è True.

Inoltre, le proprietà generali di SSLOptions CertFile e Password vengono utilizzate durante il caricamento di un certificato da un file PFX.

Certificato da Windows Store

Se il certificato è già installato nell'archivio certificati di Windows, fornire l'impronta digitale del certificato e indicare dove si trova.

Per trovare il thumbprint, aprire PowerShell ed eseguire:

dir cert:\localmachine\my

La colonna Thumbprint mostra l'hash esadecimale necessario.


Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com


oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.SChannel_Options.CertHash := 'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
oServer.Active := True;

Certificato da file PFX

Se si dispone di un file di certificato PFX (.pfx o .p12), impostare le proprietà CertFile e Password su SSLOptions. SChannel importerà il certificato all'avvio.


oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
oServer.Active := True;

Se si dispone di un certificato PEM e di una chiave privata, convertirli prima nel formato PFX utilizzando OpenSSL:

openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx

Versione TLS

Usi la proprietà SSLOptions.Version per controllare quale versione TLS il server accetta:

Valore Descrizione
tls1_0 TLS 1.0 (non raccomandato)
tls1_1 TLS 1.1
tls1_2 TLS 1.2 (consigliato)
tls1_3 TLS 1.3
tlsUndefined Accetta TLS 1.0, 1.1 e 1.2

Elenco delle cifrature

Per impostazione predefinita SChannel utilizza la configurazione dei cifrari di sistema. È possibile limitare i cifrari consentiti impostando SChannel_Options.CipherList su un elenco di nomi di algoritmi separati da due punti, ad esempio:

CALG_AES_256:CALG_AES_128

Lasciare questa proprietà vuota per utilizzare le impostazioni predefinite di Windows.

Credenziali legacy

Windows Server 2019 e versioni precedenti potrebbero non supportare la nuova API SCH_CREDENTIALS . Se il server non si avvia su una versione precedente di Windows, impostare SChannel_Options.UseLegacyCredentials su True per utilizzare la struttura legacy SCHANNEL_CRED.

Il componente rileva automaticamente la versione di Windows nella maggior parte dei casi, ma se necessario può forzare la modalità legacy.

Revoca del certificato client

Quando il server valida i certificati client (SSLOptions.VerifyCertificate impostata su True), le sotto-proprietà SChannel_Options.Revocation decidono se il certificato presentato da un client venga verificato anche rispetto al suo punto di distribuzione CRL o al suo responder OCSP. La revoca è disabilitata per impostazione predefinita. Consultare Server SSL | Revoca del certificato client con SChannel per la descrizione completa di ogni impostazione.

Vantaggi rispetto a OpenSSL

Note