TsgcWebSocketServer | TLS und unverschlüsseltes HTTP am selben Port

Ein TLS-Server (TsgcWebSocketServer, TsgcWebSocketHTTPServer und TsgcHTTPServer mit dem Standard-Indy-, IOCP- oder EPOLL-IOHandler) kann auf demselben Port, den er für TLS verwendet, auch unverschlüsselte HTTP- und WebSocket-Verbindungen annehmen. Ist diese Option aktiviert, prüft der Server das erste Byte jeder neuen Verbindung, ohne es zu entnehmen. Ein $16-Byte (TLS-Handshake-Record) bedeutet, dass der Client einen TLS-Handshake startet, jedes andere Byte bedeutet, dass die Verbindung als Klartext bedient wird. Trifft innerhalb von PlainTextTimeout kein Byte ein, wird die Verbindung als TLS behandelt, was dem bisherigen Verhalten entspricht. Mit den IOHandlern IOCP und EPOLL wird die Entscheidung anhand der ersten empfangenen Daten getroffen, ohne zu blockieren, und PlainTextTimeout wird nicht verwendet.

Typischer Einsatz ist die Migration eines bereits veröffentlichten unverschlüsselten HTTP-Ports auf HTTPS, ohne den auf den Clients konfigurierten Port zu ändern. Aktivieren Sie AllowPlainText, solange die Clients aktualisiert werden, und schalten Sie die Option wieder aus, sobald alle TLS verwenden.

Eigenschaften

Die Aufzählung TsgcSSLPlainTextPolicy ist in der Unit sgcWebSocket_Types deklariert.

Beispiel

Starten Sie einen Server auf Port 443, der TLS- und unverschlüsselte Verbindungen akzeptiert und beide bedient.


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;

Um zu erfahren, ob eine Anfrage TLS verwendet, rufen Sie die Servermethode IsTLS(AContext) auf, zum Beispiel in den Ereignissen OnCommandGet oder OnCommandOther. Die Eigenschaft TLS der Verbindung (TsgcWSConnectionServer) steht ebenfalls zur Verfügung.


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;

Einschränkungen