TsgcWebSocketServer | TLS e HTTP in chiaro sulla stessa porta

Un server TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer e TsgcHTTPServer con l'IOHandler Indy predefinito, IOCP o EPOLL) può accettare anche connessioni HTTP e WebSocket in chiaro sulla stessa porta che usa per TLS. Quando questa opzione è abilitata, il server legge in anteprima il primo byte di ogni nuova connessione. Un byte $16 (record di handshake TLS) indica che il client avvia un handshake TLS, qualsiasi altro byte indica che la connessione viene servita in chiaro. Se non arriva nessun byte entro PlainTextTimeout, la connessione viene trattata come TLS, che è il comportamento precedente. Con gli IOHandler IOCP ed EPOLL la decisione viene presa sul primo dato ricevuto, senza bloccare, e PlainTextTimeout non viene usato.

L'uso tipico è la migrazione a HTTPS di una porta HTTP in chiaro già pubblicata, senza cambiare la porta configurata sui client. Abilitare AllowPlainText mentre i client vengono aggiornati e disabilitarlo di nuovo quando tutti usano TLS.

Proprietà

L'enumerazione TsgcSSLPlainTextPolicy è dichiarata nell'unit sgcWebSocket_Types.

Esempio

Avviare un server sulla porta 443 che accetta connessioni TLS e in chiaro e serve entrambe.


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;

Per sapere se una richiesta usa TLS, chiamare il metodo del server IsTLS(AContext), ad esempio negli eventi OnCommandGet o OnCommandOther. È disponibile anche la proprietà TLS della connessione (TsgcWSConnectionServer).


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;

Limitazioni