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 :
- Active SSL — définis la propriété
SSLàTrue. - Choisis SChannel comme IOHandler — définis
SSLOptions.IOHandlersuriohSChannel. - Choisis une version TLS — définis
SSLOptions.Versionsur la version souhaitée.tls1_2est recommandé pour la plupart des déploiements. - Définis le port — définis
SSLOptions.PortetPortsur le port d'écoute (typiquement 443). - 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
- Windows uniquement. SChannel est une API Windows. Pour des serveurs multiplateformes (Linux, macOS), utilise OpenSSL (
iohOpenSSL). - Clé privée requise. Le certificat serveur doit inclure sa clé privée. Avec la méthode Windows Certificate Store, le certificat doit avoir été importé avec sa clé privée.
- Format PFX uniquement. SChannel accepte les fichiers de certificat PFX (.pfx / .p12). Si tu as des fichiers PEM, convertis-les d'abord en PFX avec la commande
openssl pkcs12. - Magasin Local Machine pour les services. Utilise
scspStoreLocalMachinepour les serveurs de production afin que le certificat soit disponible quel que soit le compte utilisateur. - Disponibilité par édition. SChannel côté serveur est disponible dans les éditions Professional, Enterprise et All-Access de sgcWebSockets.
