TsgcWebSocketServer | TLS y HTTP sin cifrar en el mismo puerto

Un servidor TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer y TsgcHTTPServer con el IOHandler Indy predeterminado, IOCP o EPOLL) también puede aceptar conexiones HTTP y WebSocket sin cifrar en el mismo puerto que utiliza para TLS. Cuando esta opción está habilitada, el servidor examina el primer byte de cada nueva conexión. Un byte $16 (registro de handshake TLS) significa que el cliente inicia un handshake TLS, cualquier otro byte significa que la conexión se atiende como texto sin cifrar. Si no llega ningún byte dentro de PlainTextTimeout, la conexión se trata como TLS, que es el comportamiento anterior. Con los IOHandlers IOCP y EPOLL la decisión se toma con los primeros datos recibidos, sin bloquear, y PlainTextTimeout no se utiliza.

El uso habitual es migrar a HTTPS un puerto HTTP sin cifrar ya publicado, sin cambiar el puerto configurado en los clientes. Habilite AllowPlainText mientras se actualizan los clientes y desactívelo de nuevo cuando todos utilicen TLS.

Propiedades

La enumeración TsgcSSLPlainTextPolicy está declarada en la unidad sgcWebSocket_Types.

Ejemplo

Inicie un servidor en el puerto 443 que acepte conexiones TLS y sin cifrar y atienda ambas.


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;

Para saber si una petición utiliza TLS, llame al método del servidor IsTLS(AContext), por ejemplo en los eventos OnCommandGet u OnCommandOther. La propiedad TLS de la conexión (TsgcWSConnectionServer) también está disponible.


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;

Limitaciones