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.
Boolean, valor predeterminado False. Cuando es True, el listener TLS también acepta conexiones sin cifrar en el mismo puerto.ptpServe (predeterminado): la petición sin cifrar se atiende con normalidad.ptpRedirect: el servidor responde 308 Permanent Redirect a https://<Host><path>, de modo que el cliente conserva el método y el cuerpo. Si la petición no tiene cabecera Host, el servidor responde 400 Bad Request.ptpReject: el servidor responde 400 Bad Request y cierra la conexión.Integer, milisegundos, valor predeterminado 5000. Tiempo de espera del primer byte del cliente antes de que la conexión se trate como TLS. Solo se aplica al IOHandler Indy predeterminado.Boolean de solo lectura de la conexión del servidor (TsgcWSConnectionServer), True cuando la conexión utiliza TLS. El método del servidor IsTLS(AContext) devuelve el mismo valor a partir del TIdContext de una petición.La enumeración TsgcSSLPlainTextPolicy está declarada en la unidad sgcWebSocket_Types.
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;
TLS leído dentro de OnConnect todavía no es fiable. A partir de la primera petición es correcto.SecurityOptions) solo se envían en conexiones TLS, nunca en las no cifradas.