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.
Boolean, Standardwert False. Bei True akzeptiert der TLS-Listener auf demselben Port auch unverschlüsselte Verbindungen.ptpServe (Standard): die unverschlüsselte Anfrage wird normal bedient.ptpRedirect: der Server antwortet mit 308 Permanent Redirect auf https://<Host><path>, sodass der Client die Methode und den Body beibehält. Enthält die Anfrage keinen Host-Header, antwortet der Server mit 400 Bad Request.ptpReject: der Server antwortet mit 400 Bad Request und schließt die Verbindung.Integer, Millisekunden, Standardwert 5000. Wartezeit auf das erste Byte des Clients, bevor die Verbindung als TLS behandelt wird. Er gilt nur für den Standard-Indy-IOHandler.Boolean der Serververbindung (TsgcWSConnectionServer), True, wenn die Verbindung TLS verwendet. Die Servermethode IsTLS(AContext) gibt denselben Wert aus dem TIdContext einer Anfrage zurück.Die Aufzählung TsgcSSLPlainTextPolicy ist in der Unit sgcWebSocket_Types deklariert.
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;
TLS noch nicht zuverlässig. Ab der ersten Anfrage ist er korrekt.SecurityOptions) werden nur bei TLS-Verbindungen gesendet, niemals bei unverschlüsselten.