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.

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 := TsgcWebSocketHTTPServer.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 := TsgcWebSocketHTTPServer.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.

Vantaggi rispetto a OpenSSL

Note