Um servidor TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer e TsgcHTTPServer com o IOHandler Indy, IOCP ou EPOLL padrão) também pode aceitar conexões HTTP e WebSocket simples na mesma porta que usa para TLS. Quando esta opção está habilitada, o servidor inspeciona o primeiro byte de cada nova conexão. Um byte $16 (registro de handshake TLS) significa que o cliente inicia um handshake TLS, qualquer outro byte significa que a conexão é atendida como texto simples. Se nenhum byte chegar dentro de PlainTextTimeout, a conexão é tratada como TLS, que é o comportamento anterior. Com os IOHandlers IOCP e EPOLL a decisão é tomada no primeiro dado recebido, sem bloqueio, e PlainTextTimeout não é usado.
O uso típico é migrar para HTTPS uma porta HTTP simples já publicada, sem alterar a porta configurada nos clientes. Habilite AllowPlainText enquanto os clientes são atualizados e desabilite-o novamente quando todos usarem TLS.
Boolean, padrão False. Quando True, o listener TLS também aceita conexões simples na mesma porta.ptpServe (padrão): a requisição simples é atendida normalmente.ptpRedirect: o servidor responde 308 Permanent Redirect para https://<Host><path>, de modo que o cliente mantém o método e o corpo. Se a requisição não tiver o cabeçalho Host, o servidor responde 400 Bad Request.ptpReject: o servidor responde 400 Bad Request e fecha a conexão.Integer, milissegundos, padrão 5000. Tempo de espera pelo primeiro byte do cliente antes de a conexão ser tratada como TLS. Aplica-se somente ao IOHandler Indy padrão.Boolean somente leitura da conexão do servidor (TsgcWSConnectionServer), True quando a conexão usa TLS. O método do servidor IsTLS(AContext) retorna o mesmo valor a partir do TIdContext de uma requisição.A enumeração TsgcSSLPlainTextPolicy é declarada na unit sgcWebSocket_Types.
Inicie um servidor na porta 443 que aceita conexões TLS e simples e atende 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 se uma requisição usa TLS, chame o método do servidor IsTLS(AContext), por exemplo nos eventos OnCommandGet ou OnCommandOther. A propriedade TLS da conexão (TsgcWSConnectionServer) também está disponível.
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 lido dentro de OnConnect ainda não é confiável. A partir da primeira requisição, ele está correto.SecurityOptions) são enviados somente em conexões TLS, nunca em conexões simples.