Un serveur TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer et TsgcHTTPServer avec l'IOHandler Indy par défaut, IOCP ou EPOLL) peut également accepter des connexions HTTP et WebSocket en clair sur le même port que celui utilisé pour TLS. Lorsque cette option est activée, le serveur examine le premier octet de chaque nouvelle connexion. Un octet $16 (enregistrement de handshake TLS) signifie que le client démarre un handshake TLS, tout autre octet signifie que la connexion est traitée en clair. Si aucun octet n'arrive avant PlainTextTimeout, la connexion est traitée comme TLS, ce qui correspond au comportement précédent. Avec les IOHandlers IOCP et EPOLL, la décision est prise à la réception des premières données, sans blocage, et PlainTextTimeout n'est pas utilisé.
L'usage typique est la migration vers HTTPS d'un port HTTP en clair déjà publié, sans modifier le port configuré sur les clients. Activez AllowPlainText pendant la mise à jour des clients, puis désactivez-le une fois que tous utilisent TLS.
Boolean, False par défaut. Lorsque la valeur est True, le listener TLS accepte aussi des connexions en clair sur le même port.ptpServe (par défaut) : la requête en clair est traitée normalement.ptpRedirect : le serveur répond 308 Permanent Redirect vers https://<Host><path>, de sorte que le client conserve la méthode et le corps de la requête. Si la requête n'a pas d'en-tête Host, le serveur répond 400 Bad Request.ptpReject : le serveur répond 400 Bad Request et ferme la connexion.Integer, en millisecondes, 5000 par défaut. Délai d'attente du premier octet du client avant que la connexion soit traitée comme TLS. Il ne s'applique qu'à l'IOHandler Indy par défaut.Boolean en lecture seule de la connexion serveur (TsgcWSConnectionServer), True lorsque la connexion utilise TLS. La méthode serveur IsTLS(AContext) renvoie la même valeur à partir du TIdContext d'une requête.L'énumération TsgcSSLPlainTextPolicy est déclarée dans l'unité sgcWebSocket_Types.
Démarrez un serveur sur le port 443 qui accepte les connexions TLS et en clair et traite les deux.
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;
Pour savoir si une requête utilise TLS, appelez la méthode serveur IsTLS(AContext), par exemple dans les événements OnCommandGet ou OnCommandOther. La propriété TLS de la connexion (TsgcWSConnectionServer) est également 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 lue dans OnConnect n'est pas encore fiable. À partir de la première requête, elle est correcte.SecurityOptions) ne sont envoyés que sur les connexions TLS, jamais sur les connexions en clair.