Server SSL | SChannel for Indy Servers

Indy 기반 서버 구성 요소(TsgcWebSocketServer, TsgcWebSocketHTTPServer)는 OpenSSL 대신 Windows SChannel(Secure Channel)을 TLS 공급자로 사용할 수 있습니다. SChannel은 네이티브 Windows TLS 구현이므로 외부 DLL이 필요하지 않습니다.

작동 방식

서버 구성 요소에서 SSL이 활성화되어 있고 IOHandler가 iohSChannel로 설정된 경우, 서버는 Windows SChannel API를 사용하여 모든 TLS 작업을 처리하는 TsgcIdServerIOHandlerSSLSChannel 인스턴스를 생성합니다. 들어오는 모든 클라이언트 연결에 대해 서버는 SChannel 공급자를 통해 TLS 핸드셰이크를 수행하여 프로토콜 버전, 암호화 스위트, 그리고 구성된 인증서 바인딩을 협상합니다.

SChannel은 Windows Certificate Store 또는 PFX 파일(.pfx / .p12)에서 인증서를 읽습니다. PEM 파일이 필요 없고 OpenSSL 라이브러리를 배포할 필요가 없습니다.

구성

Indy 서버에서 SChannel을 활성화하려면 다음 속성을 구성하십시오:

1. SSL 속성을 True로 설정하십시오.

2. SSLOptions.IOHandleriohSChannel로 설정하십시오.

3. SSLOptions.Version을 원하는 TLS 버전(tls1_2, tls1_3, ...)으로 설정하십시오.

4. SSLOptions.Port를 보안 연결에 사용되는 포트로 설정하십시오.

5. 아래에 설명된 두 가지 방법 중 하나를 사용하여 인증서를 구성하십시오.

SChannel_Options 속성

SSLOptions.SChannel_Options 하위 속성은 SChannel 전용 설정을 노출합니다:

속성 Description
CertHash Windows Certificate Store에 설치된 인증서의 지문(16진수 해시)입니다.
CertStoreName 검색할 인증서 저장소: scsnMY(Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath 저장소 위치: scspStoreLocalMachine 또는 scspStoreCurrentUser.
CipherList 선택적 콜론으로 구분된 cipher 알고리즘 목록입니다(예: CALG_AES_256:CALG_AES_128). 비어 있으면 시스템 기본값을 사용함을 의미합니다.
UseLegacyCredentials True인 경우, SCH_CREDENTIALS 대신 레거시 SCHANNEL_CRED 구조체를 사용합니다. 최신 API를 지원하지 않는 이전 Windows 버전의 경우 이를 활성화하십시오.

또한, 일반 SSLOptions 속성 CertFilePassword 는 PFX 파일에서 인증서를 로드할 때 사용됩니다.

Windows Store의 인증서

인증서가 이미 Windows Certificate Store에 설치된 경우, 인증서 thumbprint를 제공하고 위치를 표시하십시오.

지문을 찾으려면 PowerShell을 열고 다음을 실행하십시오:

dir cert:\localmachine\my

Thumbprint 열은 필요한 16진수 해시를 보여줍니다.


Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.SChannel_Options.CertHash := 'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
oServer.Active := True;

PFX 파일의 인증서

PFX (.pfx 또는 .p12) 인증서 파일이 있는 경우 SSLOptions에서 CertFilePassword 속성을 설정하십시오. SChannel은 시작 시 인증서를 가져옵니다.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
oServer.Active := True;

PEM 인증서와 개인 키가 있는 경우, 먼저 OpenSSL을 사용하여 이를 PFX 형식으로 변환하십시오.

openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx

TLS 버전

서버가 허용하는 TLS 버전을 제어하려면 SSLOptions.Version 속성을 사용하십시오:

Value Description
tls1_0 TLS 1.0 (권장되지 않음)
tls1_1 TLS 1.1
tls1_2 TLS 1.2 (권장)
tls1_3 TLS 1.3
tlsUndefined TLS 1.0, 1.1 및 1.2 수락

Cipher List

기본적으로 SChannel은 시스템 암호 구성을 사용합니다. SChannel_Options.CipherList를 콜론으로 구분된 알고리즘 이름 목록으로 설정하여 허용되는 암호를 제한할 수 있습니다. 예:

CALG_AES_256:CALG_AES_128

Windows 기본값을 사용하려면 이 속성을 비워 두십시오.

Legacy Credentials

Windows Server 2019 이전 버전은 최신 SCH_CREDENTIALS API를 지원하지 않을 수 있습니다. 이전 Windows 버전에서 서버 시작에 실패하면 레거시 SCHANNEL_CRED 구조를 대신 사용하도록 SChannel_Options.UseLegacyCredentialsTrue로 설정하십시오.

구성 요소는 대부분의 경우 Windows 버전을 자동으로 감지하지만, 필요한 경우 legacy 모드를 강제할 수 있습니다.

OpenSSL 대비 장점

Notes