Beveiligde verbindingen

Ondersteund door

 

TsgcWebSocketServer

TsgcWebSocketHTTPServer

TsgcWebSocketClient

Webbrowsers

 

SSL-ondersteuning is gebaseerd op de Indy-implementatie, dus u moet openssl- bibliotheken inzetten om deze functie te gebruiken.

TsgcWebSocketClient ondersteunt Microsoft SChannel, zodat het niet nodig is om openssl-bibliotheken te implementeren voor Windows 32 en 64 bits als de SChannel-optie is geselecteerd in de WebSocket-client.

 

 

Serverzijde

 

Om deze functie in te schakelen, moet u de volgende eigenschap inschakelen:

 

SSL/ Inschakelen

 

Er zijn andere eigenschappen die u moet definiëren:

 

SSLOptions/ CertFile/ KeyFile/ RootCertFile: u heeft een certificaat in .PEM-formaat nodig om websocket-communicatie te versleutelen.

 

SSLOptions/ Password: dit is optioneel en alleen vereist als het certificaat een wachtwoord heeft.

 

SSLOptions/ Port: poort gebruikt voor SSL-verbindingen.

 

 

 

Client Zijde

 

Om deze functie in te schakelen, moet u de volgende eigenschap inschakelen:

 

TLS/ Inschakelen

 

 

OpenSSL

 

Standaard maken client- en servercomponenten op basis van Indy gebruik van OpenSSL-bibliotheken bij verbinding met beveiligde WebSocket-servers.

Indy ondersteunt alleen de OpenSSL API 1.0.2, dus API 1.1 wordt niet ondersteund. Als u sgcWebSockets compileert met onze aangepaste Indy-bibliotheek, kunt u gebruik maken van API 1.1 en TLS 1.3-versie selecteren. Selecteer gewoon in de eigenschappen OpenSSL_Options welke OpenSSL API u wilt gebruiken:

 

 

 

Gebeurtenissen

 

Er zijn 2 gebeurtenissen die kunnen worden gebruikt om uw SSL-instellingen aan te passen:

OnSSLGetHandler

Deze gebeurtenis wordt gegenereerd voordat de SSL-handler wordt aangemaakt; u kunt hier uw eigen SSL-handler aanmaken (die moet worden geërfd van TIdServerIOHandlerSSLBase of TIdIOHandlerSSLBase) en de benodigde eigenschappen instellen.


procedure OnServerSSLGetHandler(Sender: TObject; aType: TwsSSLHandler; var aSSLHandler:
TIdServerIOHandlerSSLBase);
begin
  aSSLHandler := TCustomSSLHandler.Create(nil);
  ...
end;

OnSSLAfterCreateHandler

Als er geen aangepast SSL-object is aangemaakt, wordt er standaard één aangemaakt met de OpenSSL-handler. U kunt de SSL Handler-eigenschappen raadplegen en aanpassen indien nodig.


procedure OnSSLAfterCreateHandler(Sender: TObject; aType: TwsSSLHandler; aSSLHandler:
TIdServerIOHandlerSSLBase);
begin
  TIdServerIOHandlerSSLOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;

 

 

Microsoft SChannel

 

Vanaf sgcWebSockets 4.2.6 kunt u SChannel gebruiken in plaats van OpenSSL (alleen voor Windows vanaf Windows 7+). Dit betekent dat er geen OpenSSL-bibliotheken hoeven te worden geïmplementeerd. TLS 1.0 wordt ondersteund vanaf Windows 7, maar als u modernere implementaties zoals TLS 1.2 op Windows 7 nodig heeft, moet u TLS 1.1 en TLS 1.2 inschakelen in het Windows-register.

Vereist Delphi 2010 Professional Edition (of Enterprise Edition voor Delphi 7, 2007 en 2009).

 

Het certificaat opnieuw laden zonder herstart

Wanneer het servercertificaat wordt vernieuwd (bijvoorbeeld door een ACME- of Let's Encrypt-client), roept u de methode ReloadCertificates aan in plaats van de server te stoppen. Nieuwe TLS-handshakes gebruiken het nieuwe certificaat en verbindingen die al open zijn blijven werken met het oude certificaat totdat ze worden gesloten. De methode is beschikbaar op TsgcWebSocketServer, TsgcWebSocketHTTPServer, TsgcWebSocketProxyServer en TsgcWebSocketServer_HTTPAPI.

Overschrijf de certificaat- en sleutelbestanden ter plekke, of wijs nieuwe waarden toe aan SSLOptions.CertFile, KeyFile, RootCertFile en Password (bij de http.sys-server aan SSLOptions.Hash en CertStoreName), en roep daarna ReloadCertificates aan. De methode kan vanuit elke thread worden aangeroepen terwijl de server actief is en doet niets als de server niet actief is of SSL is uitgeschakeld. Het nieuwe certificaat en de privésleutel worden geladen en gecontroleerd voordat er iets verandert, dus als ze niet bij elkaar passen, wordt een uitzondering gegenereerd en blijft de server het vorige certificaat gebruiken. Alleen het certificaat wordt opnieuw geladen: de overige SSLOptions (cipherlijst, TLS-versies enzovoort) en de wijzigingen die in OnSSLAfterCreateHandler zijn aangebracht behouden hun actieve waarden, en voor het wijzigen daarvan is nog steeds een herstart nodig.

De op Indy gebaseerde servers laden het certificaat opnieuw met OpenSSL (thread per verbinding, IOCP op Windows en EPOLL op Linux), met SChannel en met de Native TLS van sgc (thread en IOCP/EPOLL). Een aangepaste TLS Provider die op de IOCP/EPOLL-engines is aangesloten, laadt opnieuw via zijn DoCreateTLSContext. Met stock Indy (niet de sgc Indy-fork) kan de klassieke OpenSSL-handler niet opnieuw laden en genereert ReloadCertificates een uitzondering "not supported". Met Native TLS worden TLS-sessietickets die vóór het opnieuw laden zijn uitgegeven daarna niet hervat, zodat clients gewoon een volledige handshake uitvoeren.

Wanneer op de http.sys-server (TsgcWebSocketServer_HTTPAPI) BindingOptions.ConfigureSSLCertificate True is (de standaardwaarde), koppelt ReloadCertificates het certificaat van elke SSL-binding opnieuw, atomair waar Windows dit ondersteunt. Hiervoor zijn dezelfde beheerdersrechten nodig als voor het starten van de server met SSL, en bestaande verbindingen blijven onaangetast. Wanneer ConfigureSSLCertificate False is, wordt de binding buiten het component beheerd (netsh), zodat ReloadCertificates een uitzondering genereert en de binding met netsh moet worden bijgewerkt. In .NET draait de http.sys-server op HttpListener, die het certificaat niet opnieuw kan binden: de binding wordt altijd met netsh beheerd, zodat ReloadCertificates een NotSupportedException genereert zolang de server met https actief is en het certificaat met netsh http update sslcert moet worden vernieuwd.


// 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;

Zie ook de methode ReloadCertificates.