TsgcWebSocketServer | TLS et HTTP en clair sur le même port

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.

Propriétés

L'énumération TsgcSSLPlainTextPolicy est déclarée dans l'unité sgcWebSocket_Types.

Exemple

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;

Limitations