Güvenli Bağlantılar

Şunun tarafından desteklenir

 

TsgcWebSocketServer

TsgcWebSocketHTTPServer

TsgcWebSocketClient

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:

 

 

 

Olaylar

 

SSL ayarlarınızı özelleştirmek için kullanılabilecek 2 olay vardır:

OnSSLGetHandler

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;

OnSSLAfterCreateHandler

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.