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:
- SSL'yi etkinleştirin —
SSLözelliğiniTrueolarak ayarlayın. - IOHandler olarak SChannel'i seçin —
SSLOptions.IOHandlerdeğeriniiohSChannelolarak ayarlayın. - Bir TLS sürümü seçin —
SSLOptions.Versiondeğerini istediğiniz sürüme ayarlayın. Çoğu dağıtım içintls1_2önerilir. - Bağlantı noktasını ayarlayın —
SSLOptions.PortvePortdeğerlerini dinleme bağlantı noktasına (genellikle 443) ayarlayın. - 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
- Yalnızca Windows. SChannel bir Windows API'sidir. Çok platformlu sunucular (Linux, macOS) için OpenSSL (
iohOpenSSL) kullanın. - Özel anahtar gereklidir. Sunucu sertifikası özel anahtarını içermelidir. Windows Sertifika Deposu yöntemini kullanırken, sertifika özel anahtarıyla birlikte içe aktarılmış olmalıdır.
- Yalnızca PFX biçimi. SChannel, PFX (.pfx / .p12) sertifika dosyalarını kabul eder. PEM dosyalarınız varsa, önce
openssl pkcs12komutunu kullanarak bunları PFX'e dönüştürün. - Hizmetler için Local Machine deposu. Sertifikanın kullanıcı hesabından bağımsız olarak kullanılabilmesi için üretim sunucularında
scspStoreLocalMachinekullanın. - Sürüm kullanılabilirliği. Sunucu tarafı SChannel, sgcWebSockets'in Professional, Enterprise ve All-Access sürümlerinde kullanılabilir.
