TsgcHTTPServer › 속성 › SSLOptions
TLS 리스너에 대한 인증서 경로, TLS 버전 선택, OpenSSL 튜닝을 보유합니다.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
SSL이 True인 경우 서버를 활성화하기 전에 인증서 자료를 제공하십시오: RootCertFile, CertFile, KeyFile은 PEM 파일을 가리키며(전체 체인이 포함된 파일이면 세 곳 모두 같은 경로를 사용), Password는 개인 키가 암호화된 경우에만 필요합니다. Password는 HTTP3Options로 활성화되는 HTTP/3 리스너에서도 읽으므로, 암호화된 동일한 키 파일이 두 리스너 모두에 사용됩니다. 클라이언트 인증서를 요청하고 검증하려면 VerifyCertificate를 True로 설정하십시오(하위 옵션 FailIfNoCertificate와 VerifyClientOnce가 검사를 세부적으로 조정하며, VerifyDepth는 체인 길이를 제어합니다). Version은 특정 TLS 버전(tls1_0, tls1_1, tls1_2, tls1_3)을 선택하거나 협상을 열어 둡니다(tlsUndefined). iohNativeTLS를 사용하면 이는 대신 허용되는 가장 낮은 버전입니다. 아래를 참조하십시오. OpenSSL_Options는 저수준 설정을 노출합니다: APIVersion(oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), OpenSSL 바이너리를 찾기 위한 LibPath/LibPathCustom, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin, 그리고 호스트명/IP 검증을 위한 X509Checks입니다.
IOHandler는 TLS 엔진을 선택합니다. iohOpenSSL이 기본값이고 iohSChannel은 Windows 제공자를 사용합니다. iohNativeTLS는 TLS 1.3과 TLS 1.2를 구사하는 sgcCrypto 팩의 순수 Object Pascal TLS 엔진을 선택합니다. OpenSSL 라이브러리를 전혀 로드하지 않으며, TLS 1.3에서는 RFC 10024의 하이브리드 포스트 양자 키 교환 그룹을 X25519MLKEM768부터 제공합니다. 두 가지 우선순위 목록은 NativeTLS_Options.Groups와 NativeTLS_Options.CipherSuites이며, OpenSSL 방식대로 콜론으로 구분하고, 목록을 비워 두면 엔진 기본값이 유지됩니다. 이 엔진은 연결당 스레드를 쓰는 고전적인 엔진에서도 IOCP와 EPOLL 엔진에서도 똑같이 동작합니다. iohAppleTLS와 iohAndroidTLS는 클라이언트 전용 핸들러입니다. 이 중 하나를 사용하는 서버는 Active가 True로 설정될 때 예외를 발생시킵니다. 단, OnSSLGetHandler가 자체 핸들러를 제공하는 경우는 예외입니다. 대신 iohNativeTLS, iohOpenSSL, 또는 Windows에서는 iohSChannel을 사용하십시오.
네이티브 엔진에서 Version은 iohOpenSSL과 달리 정확한 버전이 아니라 허용되는 가장 낮은 버전입니다. tlsUndefined(기본값)와 tls1_2는 TLS 1.3과 TLS 1.2를 모두 받아들이고, tls1_3은 TLS 1.3만 받아들이며, tls1_0이나 tls1_1은 서버가 시작할 때 구성 오류를 발생시킵니다. 이 엔진은 TLS 1.2와 TLS 1.3만 지원하기 때문입니다. TLS 1.2만 받아들이려면 NativeTLS_Options.CipherSuites에 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256과 같은 TLS 1.2 제품군만 지정하십시오. 이 엔진은 클라이언트 인증서를 RootCertFile의 루트, 그리고 NativeTLS_Options.UseSystemRoots가 True(기본값은 False)일 때는 운영체제가 신뢰하는 루트까지 함께 사용해 검증합니다. iohNativeTLS를 사용하면 CertFile은 인증서, 체인, 키를 담은 .pfx나 .p12 파일일 수도 있으며, Password로 엽니다. 이 엔진은 TLS 1.3과 TLS 1.2 세션 티켓으로 세션을 재개합니다. NativeTLS_Options.SessionTickets(기본값 True)가 이를 켜고, NativeTLS_Options.TicketLifetime(기본값 7200초)이 티켓을 사용할 수 있는 시간을 정합니다. TLS 1.2 재개에는 클라이언트가 확장 마스터 시크릿을 지원해야 합니다. 0-RTT는 받아들이지 않으며, OpenSSL 핸들러에 속하는 OnSSLVerifyPeer를 발생시키지 않습니다. VerifyCertificate는 클라이언트에 인증서를 요청하고 이를 검증하며, VerifyCertificate_Options.FailIfNoCertificate는 인증서를 보내지 않는 클라이언트를 거부하고, 이 엔진은 결코 재협상하지 않으므로 VerifyClientOnce는 아무 효과가 없습니다. 네이티브 TLS를 참조하십시오.
AllowPlainText(기본값 False)를 사용하면 TLS 리스너가 동일한 포트에서 일반 HTTP 및 WebSocket 연결도 수락합니다. 서버는 모든 새 연결의 첫 번째 바이트를 미리 확인합니다. $16(TLS 핸드셰이크 레코드)이면 TLS이고, 그 외에는 일반 텍스트로 처리되며, PlainTextTimeout(밀리초, 기본값 5000) 내에 바이트가 도착하지 않으면 연결은 TLS로 간주됩니다. PlainTextPolicy는 일반 연결을 어떻게 처리할지 결정합니다. ptpServe(기본값)는 요청을 정상적으로 처리하고, ptpRedirect는 메서드와 본문을 유지한 채 https://<Host><path>로 308 Permanent Redirect를 응답하며(요청에 Host 헤더가 없으면 400 Bad Request), ptpReject는 400 Bad Request를 응답하고 연결을 닫습니다. TsgcWSConnectionServer의 연결 속성 TLS는 연결이 TLS를 사용하는지 알려 줍니다. 이 옵션은 기본 Indy IOHandler와 IOCP 및 EPOLL IOHandler에서 동작합니다. OnCommandGet 내부에서 서버 메서드 IsTLS(AContext)는 요청이 TLS를 사용하는지 알려 줍니다. 동일한 포트에서 TLS와 일반 HTTP 사용을 참조하십시오.
oServer := TsgcHTTPServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;