TLS 서버(기본 Indy, IOCP 또는 EPOLL IOHandler를 사용하는 TsgcWebSocketServer, TsgcWebSocketHTTPServer, TsgcHTTPServer)는 TLS에 사용하는 동일한 포트에서 일반 HTTP 및 WebSocket 연결도 수락할 수 있습니다. 이 옵션을 활성화하면 서버는 모든 새 연결의 첫 번째 바이트를 미리 확인합니다. $16 바이트(TLS 핸드셰이크 레코드)는 클라이언트가 TLS 핸드셰이크를 시작한다는 의미이고, 그 외의 바이트는 해당 연결을 일반 텍스트로 처리한다는 의미입니다. PlainTextTimeout 시간 내에 바이트가 도착하지 않으면 연결은 TLS로 간주되며, 이는 이전 동작과 같습니다. IOCP 및 EPOLL IOHandler에서는 블로킹 없이 처음 수신한 데이터로 판단하며 PlainTextTimeout은 사용하지 않습니다.
일반적인 용도는 클라이언트에 구성된 포트를 변경하지 않고 이미 게시된 일반 HTTP 포트를 HTTPS로 마이그레이션하는 것입니다. 클라이언트를 업데이트하는 동안 AllowPlainText를 활성화하고, 모든 클라이언트가 TLS를 사용하게 되면 다시 비활성화하십시오.
Boolean, 기본값 False. True이면 TLS 리스너가 동일한 포트에서 일반 연결도 수락합니다.ptpServe(기본값): 일반 요청을 정상적으로 처리합니다.ptpRedirect: 서버가 https://<Host><path>로 308 Permanent Redirect를 응답하므로 클라이언트는 메서드와 본문을 유지합니다. 요청에 Host 헤더가 없으면 서버는 400 Bad Request를 응답합니다.ptpReject: 서버가 400 Bad Request를 응답하고 연결을 닫습니다.Integer, 밀리초, 기본값 5000. 연결을 TLS로 간주하기 전에 클라이언트의 첫 번째 바이트를 기다리는 시간입니다. 기본 Indy IOHandler에만 적용됩니다.TsgcWSConnectionServer)의 읽기 전용 Boolean이며, 연결이 TLS를 사용하면 True입니다. 서버 메서드 IsTLS(AContext)는 요청의 TIdContext에서 동일한 값을 반환합니다.열거형 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;
TLS 값은 아직 신뢰할 수 없습니다. 첫 번째 요청부터는 올바른 값입니다.SecurityOptions 참조)는 TLS 연결에서만 전송되며 일반 연결에서는 전송되지 않습니다.