SChannel Indy Sunucusu Delphi

· Özellikler

Windows üzerinde TLS özellikli sunucular dağıtan Delphi geliştiricileri yıllarca aynı zorlukla karşılaştı: doğru OpenSSL kütüphanelerini uygulamalarıyla birlikte paketlemek. Sürüm uyumsuzlukları, çalışma zamanında eksik DLL'ler ve güvenlik bildirimlerinin ardından elle yapılan güncellemeler, üretim ortamlarında sürekli bir sorun kaynağı olmuştur.

sgcWebSockets 2026.3.0 sürümünden itibaren, Indy tabanlı sunucu bileşenleri (TsgcWebSocketServer ve TsgcWebSocketHTTPServer) TLS sağlayıcısı olarak Windows SChannel (Secure Channel) kullanabilir. SChannel, Windows'un her sürümünde yerleşik olan yerel Windows TLS uygulamasıdır. Harici DLL'ler gerektirmez, doğrudan Windows Sertifika Deposu ile entegre olur ve güvenlik yamalarını Windows Update aracılığıyla otomatik olarak alır.

Bu makale, Delphi uygulamalarınızda SChannel tabanlı sunucuları nasıl yapılandıracağınızı ve dağıtacağınızı adım adım anlatır.

Neden Sunucu Tarafında SChannel?

SChannel, Windows sunucularında TLS ile ilişkili en yaygın dağıtım sorunlarını ortadan kaldırır.

Sıfır Harici Bağımlılık
SChannel, Windows'a yerleşiktir. libeay32.dll yok, ssleay32.dll yok, libcrypto yok, libssl yok. Yükleyiciniz küçülür ve dağıtımınız basitleşir.
Windows Sertifika Deposu
İşletim sistemi tarafından zaten yüklenmiş ve yönetilen sertifikaları kullanın. PEM dosyalarını oraya buraya kopyalamaya gerek yok; sertifikaya yalnızca thumbprint değeriyle başvurun.
Otomatik Güvenlik Güncellemeleri
TLS iyileştirmeleri ve güvenlik yamaları Windows Update aracılığıyla uygulanır. Elle kütüphane yükseltmesi yok, OpenSSL CVE'leri için yeniden dağıtım yok.

Hızlı Başlangıç — 5 Adım

Sunucunuzda SChannel'i etkinleştirmek yalnızca birkaç özellik değişikliği gerektirir:

  1. SSL'yi etkinleştirinSSL özelliğini True olarak ayarlayın.
  2. IOHandler olarak SChannel'i seçinSSLOptions.IOHandler değerini iohSChannel olarak ayarlayın.
  3. Bir TLS sürümü seçinSSLOptions.Version değerini istediğiniz sürüme ayarlayın. Çoğu dağıtım için tls1_2 önerilir.
  4. Bağlantı noktasını ayarlayınSSLOptions.Port ve Port değerlerini dinleme bağlantı noktasına (genellikle 443) ayarlayın.
  5. Sertifikayı yapılandırın — Windows Sertifika Deposu (thumbprint) veya bir PFX dosyası aracılığıyla bir sertifika sağlayın.

Yöntem 1: Windows Deposundan Sertifika

Sertifikanız Windows Sertifika Deposunda zaten yüklüyse, yalnızca thumbprint değerini sağlamanız gerekir. Bu, üretim sunucuları ve Windows hizmetleri için önerilen yaklaşımdır.

Sertifika Thumbprint Değerini Bulun

PowerShell'i açın ve Local Machine kişisel deposundaki sertifikaları listeleyin:

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

Kullanmak istediğiniz sertifikanın 40 karakterlik onaltılık thumbprint değerini kopyalayın.

Sunucuyu Yapılandırın

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;

Üretim ipucu. Windows hizmeti olarak dağıtılan sunucular için her zaman scspStoreLocalMachine kullanın. Local Machine deposu, hizmeti hangi kullanıcı hesabının çalıştırdığından bağımsız olarak erişilebilirken, scspStoreCurrentUser oturum açmış kullanıcının profiline bağlıdır.

Sertifika Deposu Seçenekleri

Depo Adı Sabit İçerik
Personal (MY) scsnMY Özel anahtarları olan sunucu sertifikaları
Root scsnRoot Güvenilen kök sertifika yetkilileri
Trust scsnTrust Güvenilen sertifikalar
CA scsnCA Ara sertifika yetkilileri

Yöntem 2: Bir PFX Dosyasından Sertifika

Bir PFX (.pfx veya .p12) sertifika dosyanız varsa, bunu Windows Sertifika Deposuna yüklemeden doğrudan yükleyebilirsiniz. SChannel, sertifikayı sunucu başlangıcında içe aktarır.

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;

PEM dosyalarınız mı var? SChannel yalnızca PFX biçimini kabul eder. PEM sertifikanızı ve özel anahtarınızı tek bir komutla dönüştürün:

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

SChannel_Options Başvurusu

SSLOptions.SChannel_Options alt özelliği, SChannel'e özgü tüm sunucu ayarlarını sunar.

Özellik Tür Açıklama
CertHash String Windows Sertifika Deposunda yüklü bir sertifikanın 40 karakterlik onaltılık thumbprint değeri.
CertStoreName Enum Hangi deponun aranacağı: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath Enum Depo konumu: scspStoreLocalMachine (önerilir) veya scspStoreCurrentUser.
CipherList String İzin verilen cipher algoritmalarının iki nokta üst üste ile ayrılmış listesi (örneğin CALG_AES_256:CALG_AES_128). Windows varsayılanları için boş bırakın.
UseLegacyCredentials Boolean True olduğunda eski SCHANNEL_CRED yapısını kullanır. Windows Server 2019 ve önceki sürümler için etkinleştirin.

TLS Sürüm Yapılandırması

Sunucunun hangi TLS protokol sürümünü kabul edeceğini SSLOptions.Version özelliği aracılığıyla denetleyin.

Değer Protokol Öneri
tls1_3 TLS 1.3 En iyi güvenlik. Tüm istemciler desteklediğinde kullanın.
tls1_2 TLS 1.2 Çoğu üretim dağıtımı için önerilir.
tls1_1 TLS 1.1 Eski. Eski istemciler tarafından gerekmedikçe kullanmaktan kaçının.
tls1_0 TLS 1.0 Kullanımdan kaldırıldı. Önerilmez.
tlsUndefined TLS 1.0 – 1.2 TLS 1.0, 1.1 veya 1.2'den herhangi birini kabul eder.
// Enforce TLS 1.2 minimum for modern security
oServer.SSLOptions.Version := tls1_2;
// Or use TLS 1.3 for the strongest encryption
oServer.SSLOptions.Version := tls1_3;

Cipher Suite Yapılandırması

Varsayılan olarak SChannel, Windows tarafından yönetilen sistem genelindeki cipher yapılandırmasını kullanır. Daha sıkı denetim gerektiren ortamlar için, izin verilen algoritmaları kısıtlayabilirsiniz.

// Restrict to AES-256 and AES-128 only
oServer.SSLOptions.SChannel_Options.CipherList :=
  'CALG_AES_256:CALG_AES_128';

Windows varsayılan cipher yapılandırmasını kabul etmek için CipherList özelliğini boş bırakın. Windows, Windows Update aracılığıyla güncellenen güvenli bir varsayılan küme tuttuğundan, bu çoğu dağıtım için uygundur.

Dikkat. Cipher'ları çok agresif şekilde kısıtlamak bazı istemcilerin bağlanmasını engelleyebilir. Üretimde özel cipher listeleri dağıtmadan önce beklenen istemci tabanınıza karşı kapsamlı şekilde test edin.

Eski Windows Uyumluluğu

Bileşen, varsayılan olarak modern SCH_CREDENTIALS API'sini kullanır. Bu API'yi desteklemeyen eski Windows sürümlerinde (Server 2019 ve öncesi), eski kimlik bilgisi yapısına geri dönebilirsiniz.

// Enable legacy mode for Windows Server 2019 and earlier
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;

Çoğu durumda bileşen, Windows sürümünü otomatik olarak algılar ve uygun API'yi seçer. UseLegacyCredentials özelliğini yalnızca sunucu eski bir Windows sürümünde başlatılamadığında kullanın.

SChannel ve OpenSSL Karşılaştırması — Hangisi Ne Zaman Kullanılmalı

Her iki TLS sağlayıcısı da tam olarak desteklenir. Doğru seçim, dağıtım platformunuza ve operasyonel gereksinimlerinize bağlıdır.

Özellik SChannel OpenSSL
Harici DLL gereksinimi Hayır Evet
Windows Sertifika Deposu Yerel Desteklenmiyor
Otomatik güvenlik güncellemeleri Evet (Windows Update) Elle kütüphane güncellemesi
Çok platformlu Yalnızca Windows Windows, Linux, macOS
Sertifika biçimleri PFX + Windows Deposu PEM, PFX
TLS 1.0 – 1.3 Evet Evet

Özetle. Sunucunuz yalnızca Windows üzerinde çalışıyorsa, SChannel daha basit ve daha kolay bakımı yapılabilen seçenektir. Çok platformlu desteğe ihtiyacınız varsa iohOpenSSL kullanın. İkisi arasında geçiş yapmak yalnızca IOHandler özelliğini değiştirmeyi gerektirir; başka kod değişikliği gerekmez.

Tam Örnek: Güvenli WebSocket Sunucusu

Windows Sertifika Deposundan alınan bir sertifikayla SChannel kullanan, tam olarak yapılandırılmış bir WebSocket sunucusu.

uses
  sgcWebSocket_Server, sgcWebSocket_Classes;
var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // Server configuration
    oServer.Port := 443;
    // TLS configuration with SChannel
    oServer.SSL := True;
    oServer.SSLOptions.IOHandler := iohSChannel;
    oServer.SSLOptions.Version := tls1_2;
    oServer.SSLOptions.Port := 443;
    // Certificate from Windows Certificate Store
    oServer.SSLOptions.SChannel_Options.CertHash :=
      'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
    oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
    oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
    // Assign WebSocket event handlers
    oServer.OnConnect := OnClientConnect;
    oServer.OnDisconnect := OnClientDisconnect;
    oServer.OnMessage := OnClientMessage;
    // Start the server
    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;

Her İki Sunucu Bileşeniyle Çalışır

SChannel, her iki Indy tabanlı sunucu bileşeninde de kullanılabilir. Yapılandırma aynıdır.

Bileşen Açıklama
TsgcWebSocketHTTPServer Yerleşik HTTP sunuculu WebSocket sunucusu. Birleşik WebSocket + REST API'leri için idealdir.
TsgcWebSocketServer Indy TCP tabanlı saf WebSocket sunucusu. Özel WebSocket uç noktaları için en iyisidir.

Önemli Notlar