TsgcWebSocketServer | TLS en gewone HTTP op dezelfde poort

Een TLS-server (TsgcWebSocketServer, TsgcWebSocketHTTPServer en TsgcHTTPServer met de standaard Indy, IOCP of EPOLL IOHandler) kan ook gewone HTTP- en WebSocket-verbindingen accepteren op dezelfde poort die hij voor TLS gebruikt. Als deze optie is ingeschakeld, bekijkt de server de eerste byte van elke nieuwe verbinding. Een $16-byte (TLS handshake record) betekent dat de client een TLS-handshake start, elke andere byte betekent dat de verbinding als gewone tekst wordt afgehandeld. Als er binnen PlainTextTimeout geen byte binnenkomt, wordt de verbinding als TLS behandeld, wat het eerdere gedrag is. Met de IOCP- en EPOLL-IOHandlers wordt de beslissing genomen op de eerste ontvangen data, zonder te blokkeren, en wordt PlainTextTimeout niet gebruikt.

Het typische gebruik is het migreren van een bestaande gepubliceerde gewone HTTP-poort naar HTTPS zonder de poort te wijzigen die bij de clients is geconfigureerd. Schakel AllowPlainText in terwijl de clients worden bijgewerkt en schakel het weer uit zodra ze allemaal TLS gebruiken.

Eigenschappen

De enumeratie TsgcSSLPlainTextPolicy is gedeclareerd in de unit sgcWebSocket_Types.

Voorbeeld

Start een server op poort 443 die TLS- en gewone verbindingen accepteert en beide afhandelt.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.Port := 443;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.AllowPlainText := True;
oServer.SSLOptions.PlainTextPolicy := ptpServe;
oServer.Active := True;

Om te weten of een verzoek TLS gebruikt, roept u de servermethode IsTLS(AContext) aan, bijvoorbeeld in de gebeurtenissen OnCommandGet of OnCommandOther. De eigenschap TLS van de verbinding (TsgcWSConnectionServer) is ook beschikbaar.


procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  if TsgcWebSocketHTTPServer1.IsTLS(AContext) then
    AResponseInfo.ContentText := 'Secure connection'
  else
    AResponseInfo.ContentText := 'Plain connection, please use https://';
end;

Beperkingen