Serveur SChannel Indy en Delphi

· Fonctionnalités

Depuis des années, les développeurs Delphi qui déploient des serveurs TLS sur Windows font face au même défi : embarquer les bonnes bibliothèques OpenSSL avec leur application. Versions incompatibles, DLL manquantes à l'exécution, mises à jour manuelles après les avis de sécurité : autant de sources de friction constantes en production.

À partir de sgcWebSockets 2026.3.0, les composants serveur basés sur Indy — TsgcWebSocketServer et TsgcWebSocketHTTPServer — peuvent utiliser Windows SChannel (Secure Channel) comme fournisseur TLS. SChannel est l'implémentation TLS native de Windows, intégrée à toutes les versions de Windows. Elle ne nécessite aucune DLL externe, s'intègre directement au Windows Certificate Store et reçoit les correctifs de sécurité automatiquement via Windows Update.

Cet article explique comment configurer et déployer des serveurs basés sur SChannel dans tes applications Delphi.

Pourquoi SChannel côté serveur ?

SChannel élimine les principaux casse-tête de déploiement liés à TLS sur les serveurs Windows.

Zéro dépendance externe
SChannel est intégré à Windows. Pas de libeay32.dll, pas de ssleay32.dll, pas de libcrypto, pas de libssl. Ton installateur est plus petit et ton déploiement plus simple.
Windows Certificate Store
Utilise les certificats déjà installés et gérés par le système d'exploitation. Plus besoin de copier des fichiers PEM — il suffit de référencer le certificat par son empreinte.
Mises à jour de sécurité automatiques
Les améliorations TLS et les correctifs de sécurité sont appliqués via Windows Update. Pas de mises à niveau manuelles de bibliothèques, pas de redéploiement à chaque CVE d'OpenSSL.

Démarrage rapide — en 5 étapes

Activer SChannel sur ton serveur ne demande que quelques changements de propriétés :

  1. Active SSL — définis la propriété SSL à True.
  2. Choisis SChannel comme IOHandler — définis SSLOptions.IOHandler sur iohSChannel.
  3. Choisis une version TLS — définis SSLOptions.Version sur la version souhaitée. tls1_2 est recommandé pour la plupart des déploiements.
  4. Définis le port — définis SSLOptions.Port et Port sur le port d'écoute (typiquement 443).
  5. Configure le certificat — fournis un certificat via le Windows Certificate Store (empreinte) ou un fichier PFX.

Méthode 1 : certificat depuis le Windows Store

Si ton certificat est déjà installé dans le Windows Certificate Store, il suffit de fournir son empreinte. C'est l'approche recommandée pour les serveurs de production et les services Windows.

Trouver l'empreinte du certificat

Ouvre PowerShell et liste les certificats du magasin personnel Local Machine :

PS C:\> dir cert:\localmachine\my
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com
A7F3D2E1B9C84A6D5E0F123456789ABCDEF01234  CN=api.mydomain.com

Copie l'empreinte hexadécimale de 40 caractères du certificat que tu veux utiliser.

Configurer le serveur

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Point to the certificate in the Windows Store
  oServer.SSLOptions.SChannel_Options.CertHash :=
    'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
  oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
  oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
  // Start listening
  oServer.Active := True;
end;

Astuce production. Utilise toujours scspStoreLocalMachine pour les serveurs déployés en tant que services Windows. Le magasin Local Machine est accessible quel que soit le compte utilisateur exécutant le service, alors que scspStoreCurrentUser est lié au profil de l'utilisateur connecté.

Options du magasin de certificats

Nom du magasin Constante Contenu
Personnel (MY) scsnMY Certificats serveur avec clé privée
Root scsnRoot Autorités de certification racines de confiance
Trust scsnTrust Certificats de confiance
CA scsnCA Autorités de certification intermédiaires

Méthode 2 : certificat depuis un fichier PFX

Si tu disposes d'un fichier de certificat PFX (.pfx ou .p12), tu peux le charger directement sans l'installer dans le Windows Certificate Store. SChannel importera le certificat au démarrage du serveur.

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Load certificate from a PFX file
  oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
  oServer.SSLOptions.Password := 'mypassword';
  // Start listening
  oServer.Active := True;
end;

Tu as des fichiers PEM ? SChannel n'accepte que le format PFX. Convertis ton certificat et ta clé privée PEM avec une seule commande :

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

Référence SChannel_Options

La sous-propriété SSLOptions.SChannel_Options expose tous les paramètres serveur spécifiques à SChannel.

Propriété Type Description
CertHash String L'empreinte hexadécimale de 40 caractères d'un certificat installé dans le Windows Certificate Store.
CertStoreName Enum Quel magasin chercher : scsnMY (Personnel), scsnRoot, scsnTrust, scsnCA.
CertStorePath Enum Emplacement du magasin : scspStoreLocalMachine (recommandé) ou scspStoreCurrentUser.
CipherList String Liste séparée par des deux-points des algorithmes de chiffrement autorisés (par exemple CALG_AES_256:CALG_AES_128). Laisse vide pour les valeurs par défaut de Windows.
UseLegacyCredentials Boolean Quand True, utilise la structure héritée SCHANNEL_CRED. À activer pour Windows Server 2019 et antérieur.

Configuration de la version TLS

Contrôle la version du protocole TLS acceptée par le serveur via la propriété SSLOptions.Version.

Valeur Protocole Recommandation
tls1_3 TLS 1.3 Meilleure sécurité. À utiliser quand tous les clients la prennent en charge.
tls1_2 TLS 1.2 Recommandée pour la plupart des déploiements en production.
tls1_1 TLS 1.1 Hérité. À éviter sauf si requis par d'anciens clients.
tls1_0 TLS 1.0 Déprécié. Non recommandé.
tlsUndefined TLS 1.0 – 1.2 Accepte TLS 1.0, 1.1 ou 1.2.
// Force TLS 1.2 minimum pour une sécurité moderne
oServer.SSLOptions.Version := tls1_2;
// Ou utilise TLS 1.3 pour le chiffrement le plus fort
oServer.SSLOptions.Version := tls1_3;

Configuration de la suite de chiffrement

Par défaut, SChannel utilise la configuration des chiffrements à l'échelle du système gérée par Windows. Pour les environnements qui exigent un contrôle plus strict, tu peux restreindre les algorithmes autorisés.

// Restreint à AES-256 et AES-128 uniquement
oServer.SSLOptions.SChannel_Options.CipherList :=
  'CALG_AES_256:CALG_AES_128';

Laisse la propriété CipherList vide pour accepter la configuration de chiffrements par défaut de Windows. Cela convient à la plupart des déploiements, car Windows maintient un ensemble par défaut sécurisé, mis à jour via Windows Update.

Attention. Restreindre les chiffrements de manière trop agressive peut empêcher certains clients de se connecter. Teste minutieusement avec ta base de clients attendue avant de déployer des listes de chiffrements personnalisées en production.

Compatibilité avec les Windows hérités

Le composant utilise l'API moderne SCH_CREDENTIALS par défaut. Sur les anciennes versions de Windows (Server 2019 et antérieur) qui ne la prennent pas en charge, tu peux te rabattre sur la structure d'identifiants héritée.

// Active le mode hérité pour Windows Server 2019 et antérieur
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;

Dans la plupart des cas, le composant détecte automatiquement la version de Windows et sélectionne l'API appropriée. N'utilise la propriété UseLegacyCredentials que si le serveur ne démarre pas sur une ancienne version de Windows.

SChannel ou OpenSSL — quand utiliser l'un ou l'autre

Les deux fournisseurs TLS sont entièrement pris en charge. Le bon choix dépend de ta plateforme de déploiement et de tes exigences opérationnelles.

Fonctionnalité SChannel OpenSSL
DLL externes requises No Yes
Windows Certificate Store Natif Non pris en charge
Mises à jour de sécurité automatiques Oui (Windows Update) Mise à jour manuelle de la bibliothèque
Multiplateforme Windows uniquement Windows, Linux, macOS
Formats de certificat PFX + Windows Store PEM, PFX
TLS 1.0 – 1.3 Yes Yes

En résumé. Si ton serveur fonctionne exclusivement sur Windows, SChannel est le choix le plus simple et le plus maintenable. Si tu as besoin de prise en charge multiplateforme, utilise iohOpenSSL. Pour basculer entre les deux, il suffit de changer la propriété IOHandler — aucune autre modification de code n'est nécessaire.

Exemple complet : serveur WebSocket sécurisé

Un serveur WebSocket entièrement configuré qui utilise SChannel avec un certificat du Windows Certificate Store.

uses
  sgcWebSocket_Server, sgcWebSocket_Classes;
var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // Configuration du serveur
    oServer.Port := 443;
    // Configuration TLS avec SChannel
    oServer.SSL := True;
    oServer.SSLOptions.IOHandler := iohSChannel;
    oServer.SSLOptions.Version := tls1_2;
    oServer.SSLOptions.Port := 443;
    // Certificat depuis le Windows Certificate Store
    oServer.SSLOptions.SChannel_Options.CertHash :=
      'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
    oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
    oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
    // Associe les gestionnaires d'événements WebSocket
    oServer.OnConnect := OnClientConnect;
    oServer.OnDisconnect := OnClientDisconnect;
    oServer.OnMessage := OnClientMessage;
    // Démarre le serveur
    oServer.Active := True;
    WriteLn('Secure WebSocket server listening on port 443 (SChannel TLS 1.2)');
    WriteLn('Press Enter to stop...');
    ReadLn;
  Finally
    oServer.Active := False;
    oServer.Free;
  End;
end;

Fonctionne avec les deux composants serveur

SChannel est disponible sur les deux composants serveur basés sur Indy. La configuration est identique.

Composant Description
TsgcWebSocketHTTPServer Serveur WebSocket avec serveur HTTP intégré. Idéal pour combiner WebSocket + API REST.
TsgcWebSocketServer Serveur WebSocket pur basé sur Indy TCP. Idéal pour les endpoints WebSocket dédiés.

Notes importantes