TsgcWebSocketServer | 同一ポートでのTLSとプレーンHTTP

TLSサーバー(デフォルトのIndy、IOCPまたはEPOLL IOHandlerを使用する TsgcWebSocketServer、TsgcWebSocketHTTPServer、TsgcHTTPServer)は、TLSに使用しているものと同じポートでプレーンHTTPおよびWebSocket接続も受け付けることができます。このオプションを有効にすると、サーバーは新しい接続ごとに最初の1バイトを先読みします。$16 バイト(TLSハンドシェイクレコード)はクライアントがTLSハンドシェイクを開始することを意味し、それ以外のバイトの場合、その接続はプレーンテキストとして処理されます。PlainTextTimeout の間にバイトが届かない場合、その接続はTLSとして扱われます。これは従来の動作です。IOCPおよびEPOLL IOHandlerでは、判定はブロックせずに最初に受信したデータで行われ、PlainTextTimeout は使用されません。

典型的な用途は、公開済みの既存のプレーンHTTPポートを、クライアント側に設定されたポートを変更せずにHTTPSへ移行することです。クライアントを更新している間は AllowPlainText を有効にし、すべてのクライアントがTLSを使用するようになったら再び無効にしてください。

プロパティ

列挙型 TsgcSSLPlainTextPolicy はユニット sgcWebSocket_Types で宣言されています。

例

TLS接続とプレーン接続の両方を受け付けて処理する、ポート443のサーバーを起動します。


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;

リクエストがTLSを使用しているかどうかを知るには、サーバーメソッド IsTLS(AContext) を呼び出します。たとえば OnCommandGet または OnCommandOther イベントで使用できます。接続(TsgcWSConnectionServer)の TLS プロパティも利用できます。


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;

制限事項