TsgcWebSocketServer › 속성 › SSLOptions

SSLOptions 속성

TLS 리스너에 대한 인증서 경로, TLS 버전 선택, OpenSSL 튜닝을 보유합니다.

구문

property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;

기본값

Version=tlsUndefined, VerifyCertificate=False

설명

SSL이 True인 경우 서버를 활성화하기 전에 인증서 자료를 제공하십시오. RootCertFile, CertFile 및 KeyFile은 PEM 파일을 가리킵니다(파일에 전체 체인이 포함된 경우 세 개 모두 동일한 경로 사용). Password는 개인 키가 암호화된 경우에만 필요합니다. 클라이언트 인증서를 요청하고 검증하려면 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입니다.

VerifyCertificate는 클라이언트 인증서가 발급된 이후에 해지되었는지 여부에 대해서는 아무것도 알려주지 않으므로, 키를 도난당하고 그 일련번호가 이미 해지된 인증서라도 만료될 때까지 여전히 세션을 열 수 있습니다. IOHandler=iohSChannel인 경우, 클라이언트 인증서의 해지 상태는 SChannel_Options.Revocation.Check가 기본값인 scrcDisabled 이외의 값으로 설정된 경우에만 조회됩니다. scrcEndCertificate는 클라이언트 인증서만 확인하고, scrcChainExcludeRoot는 중간 인증서까지 함께 확인하며, scrcChain은 루트까지 포함합니다. Revocation.Timeout은 CRL 및 OCSP 조회 전체를 제한하므로(기본값 5000ms) 도달할 수 없는 응답자가 핸드셰이크를 지연시킬 수 없고, Revocation.CacheOnly는 Windows가 이미 캐시해 둔 데이터만 사용하며 네트워크에 접속하지 않습니다. Revocation.IgnoreRevocationOffline과 Revocation.IgnoreNoRevocationCheck(둘 다 True)는 도달할 수 없는 응답자나 해지 정보를 게시하지 않는 클라이언트 인증서를 수락할지 결정합니다. 해지가 확인된 인증서는 항상 거부됩니다. Preset := tlspSecureDefaults를 설정하면 이 확인이 scrcChainExcludeRoot로 활성화되고 두 가지 소프트 실패 설정은 유지되므로, 기존에 허용되던 클라이언트는 계속 허용됩니다. Server SSL | SChannel Client Certificate Revocation을 참조하십시오.

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 := TsgcWebSocketServer.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;

속성으로 돌아가기