Şunun tarafından desteklenir
Web Tarayıcıları
SSL desteği Indy uygulamasına dayanır, bu nedenle bu özelliği kullanmak için openssl kütüphanelerini dağıtmanız gerekir.
TsgcWebSocketClient Microsoft SChannel'ı destekler, dolayısıyla WebSocket İstemcisinde SChannel seçeneği seçildiyse windows 32 ve 64 bit için openssl kütüphanelerini dağıtmaya gerek yoktur.
Server Side
Bu özelliği etkinleştirmek için aşağıdaki özelliği etkinleştirmeniz gerekir:
SSL/ Enable
Tanımlamanız gereken başka özellikler de vardır:
SSLOptions/ CertFile/ KeyFile/ RootCertFile: websocket iletişimlerini şifrelemek için .PEM formatında bir sertifikaya ihtiyacınız var.
SSLOptions/ Password: bu isteğe bağlıdır ve yalnızca sertifikanın bir parolası varsa gereklidir.
SSLOptions/ Port: SSL bağlantılarında kullanılan port.
İstemci Tarafı
Bu özelliği etkinleştirmek için aşağıdaki özelliği etkinleştirmeniz gerekir:
TLS/ Enable
OpenSSL
Varsayılan olarak, Indy tabanlı istemci ve sunucu bileşenleri, güvenli websocket sunucularına bağlanırken openSSL kütüphanelerini kullanır.
Indy yalnızca 1.0.2 OpenSSL API'sini destekler, bu nedenle API 1.1 desteklenmez. sgcWebSockets'i özel Indy kütüphanemizle derlerseniz API 1.1'i kullanabilir ve TLS 1.3 sürümünü seçebilirsiniz. Sadece OpenSSL_Options özelliklerinde hangi OpenSSL API'sini kullanmak istediğinizi seçin:
oslAPI_1_0: bu varsayılan Indy API'sidir, openssl 1.0.2 kütüphaneleriyle standart Indy paketini kullanabilirsiniz.
oslAPI_1_1: yalnızca sgcWebSockets'i özel Indy kütüphanemizle (Enterprise Edition) derliyorsanız seçin. openssl 1.1.1 kütüphanelerini kullanır.
oslAPI_3_0: yalnızca sgcWebSockets'i özel Indy kütüphanemizle (Enterprise Edition) derliyorsanız seçin. openssl 3.0.0 kütüphanelerini kullanacaktır.
ECDHE: TLS 1.2 için ECDHE'yi etkinleştirmenize olanak tanır (daha güvenli bağlantılar).
Olaylar
SSL ayarlarınızı özelleştirmek için kullanılabilecek 2 olay vardır:
Bu olay SSL işleyici oluşturulmadan önce tetiklenir, burada kendi SSL İşleyicinizi oluşturabilir (TIdServerIOHandlerSSLBase veya TIdIOHandlerSSLBase'den miras alınması gerekir) ve gereken özellikleri ayarlayabilirsiniz
procedure OnServerSSLGetHandler(Sender: TObject; aType: TwsSSLHandler; var aSSLHandler:
TIdServerIOHandlerSSLBase);
begin
aSSLHandler := TCustomSSLHandler.Create(nil);
...
end;
Hiçbir özel SSL nesnesi oluşturulmamışsa, OpenSSL işleyicisi kullanılarak varsayılan olarak biri oluşturulur. SSL Handler özelliklerine erişebilir ve gerekirse bunları değiştirebilirsiniz.
procedure OnSSLAfterCreateHandler(Sender: TObject; aType: TwsSSLHandler; aSSLHandler:
TIdServerIOHandlerSSLBase);
begin
TIdServerIOHandlerSSLOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;
Microsoft SChannel
sgcWebSockets 4.2.6'dan itibaren openssl yerine SChannel kullanabilirsiniz (yalnızca Windows 7+ için Windows). Bu, openssl kütüphanelerini dağıtmaya gerek olmadığı anlamına gelir. TLS 1.0, Windows 7'den itibaren desteklenir, ancak Windows 7'de TLS 1.2 gibi daha modern uygulamalara ihtiyacınız varsa, Windows Kayıt Defteri'nde TLS 1.1 ve TLS 1.2'yi etkinleştirmelisiniz.
Delphi 2010 Professional Edition gerektirir (veya Delphi 7, 2007 ve 2009 için Enterprise Edition).
Sertifikayı yeniden başlatmadan yeniden yükleme
Sunucu sertifikası yenilendiğinde (örneğin bir ACME veya Let's Encrypt istemcisi tarafından), sunucuyu durdurmak yerine ReloadCertificates yöntemini çağırın. Yeni TLS el sıkışmaları yeni sertifikayı kullanır; zaten açık olan bağlantılar kapanana kadar eski sertifikayla çalışmaya devam eder. TsgcWebSocketServer, TsgcWebSocketHTTPServer, TsgcWebSocketProxyServer ve TsgcWebSocketServer_HTTPAPI üzerinde kullanılabilir.
Sertifika ve anahtar dosyalarının üzerine yazın veya SSLOptions.CertFile, KeyFile, RootCertFile ve Password için (http.sys sunucusunda SSLOptions.Hash ve CertStoreName için) yeni değerler atayın, ardından ReloadCertificates'i çağırın. Sunucu etkinken herhangi bir iş parçacığından çağrılabilir; sunucu etkin değilse veya SSL devre dışıysa hiçbir şey yapmaz. Yeni sertifika ve özel anahtar herhangi bir şey değişmeden önce yüklenir ve denetlenir, bu nedenle eşleşmezlerse bir istisna oluşur ve sunucu önceki sertifikayı sunmaya devam eder. Yalnızca sertifika yeniden yüklenir: diğer SSLOptions (şifre listesi, TLS sürümleri vb.) ve OnSSLAfterCreateHandler içinde yapılan değişiklikler çalışan değerlerini korur ve bunları değiştirmek yine yeniden başlatma gerektirir.
Indy tabanlı sunucular sertifikayı OpenSSL ile (bağlantı başına iş parçacığı, Windows'ta IOCP ve Linux'ta EPOLL), SChannel ile ve sgc Native TLS ile (iş parçacığı ve IOCP/EPOLL) yeniden yükler. IOCP/EPOLL motorlarına takılan özel bir TLS Provider, DoCreateTLSContext üzerinden yeniden yükler. Stock Indy ile (sgc Indy çatalı değil) klasik OpenSSL işleyicisi yeniden yükleyemez ve ReloadCertificates bir "not supported" istisnası oluşturur. Native TLS ile, yeniden yüklemeden önce verilen TLS oturum biletleri sonrasında sürdürülmez, bu yüzden istemciler basitçe tam bir el sıkışma yapar.
http.sys sunucusunda (TsgcWebSocketServer_HTTPAPI), BindingOptions.ConfigureSSLCertificate True olduğunda (varsayılan), ReloadCertificates her SSL binding'inin sertifikasını Windows'un desteklediği yerlerde atomik olarak yeniden bağlar. Sunucuyu SSL ile başlatmakla aynı yönetici haklarını gerektirir ve kurulmuş bağlantılara dokunulmaz. ConfigureSSLCertificate False olduğunda binding bileşenin dışında (netsh) yönetilir, bu nedenle ReloadCertificates bir istisna oluşturur ve binding netsh ile güncellenmelidir. .NET'te http.sys sunucusu sertifikayı yeniden bağlayamayan HttpListener üzerinde çalışır ve binding her zaman netsh ile yönetilir, bu nedenle sunucu https ile etkinken ReloadCertificates NotSupportedException oluşturur ve sertifika netsh http update sslcert ile yenilenmelidir.
// uses sgcWebSocket, Dialogs, SysUtils; field: oServer: TsgcWebSocketHTTPServer;
procedure TForm1.FormCreate(Sender: TObject);
begin
oServer := TsgcWebSocketHTTPServer.Create(Self);
oServer.Port := 80;
oServer.SSL := True;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'C:\certs\fullchain.pem';
oServer.SSLOptions.KeyFile := 'C:\certs\privkey.pem';
oServer.Active := True;
end;
procedure TForm1.btnReloadClick(Sender: TObject);
begin
try
oServer.SSLOptions.CertFile := 'C:\certs\renewed\fullchain.pem';
oServer.SSLOptions.KeyFile := 'C:\certs\renewed\privkey.pem';
oServer.ReloadCertificates;
except
on E: Exception do
ShowMessage('Certificate reload failed: ' + E.Message);
end;
end;
Ayrıca bkz. ReloadCertificates yöntemi.