サーバー SSL | Indy サーバー向け SChannel

Indy ベースのサーバーコンポーネント (TsgcWebSocketServerTsgcWebSocketHTTPServer) は、OpenSSL の代わりに Windows SChannel (Secure Channel) を TLS プロバイダーとして使用できます。SChannel はネイティブの Windows TLS 実装であるため、外部 DLL は不要です。

動作の仕組み

サーバーコンポーネントで SSL が有効になっており、IOHandler が iohSChannel に設定されている場合、サーバーは Windows SChannel API を使用してすべての TLS 操作を処理する TsgcIdServerIOHandlerSSLSChannel インスタンスを作成します。 受信クライアント接続ごとに、サーバーは SChannel プロバイダーを通じて TLS ハンドシェイクを実行し、プロトコルバージョン、暗号スイートをネゴシエートし、設定された証明書をバインドします。

SChannel はWindows 証明書ストアまたは 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. 以下に説明する2つの方法のいずれかを使用して 証明書を設定します。

SChannel_Options プロパティ

SSLOptions.SChannel_Options サブプロパティは SChannel 固有の設定を公開します:

プロパティ 説明
CertHash Windows 証明書ストアにインストールされた証明書のサムプリント (16進数のハッシュ)。
CertStoreName 検索する証明書ストア: scsnMY(個人)、scsnRoot、scsnTrust、scsnCA。
CertStorePath ストアの場所: scspStoreLocalMachineまたは scspStoreCurrentUser です。
CipherList オプションのコロン区切り暗号アルゴリズムリスト(例: CALG_AES_256:CALG_AES_128)。空の場合はシステムのデフォルトを使用します。
UseLegacyCredentials True の場合、新しい SCH_CREDENTIALS 構造の代わりにレガシーの SCHANNEL_CRED 構造を使用します。新しい API をサポートしていない古い Windows バージョンでこれを有効にしてください。

さらに、一般的な SSLOptions プロパティの CertFilePassword は、PFXファイルから証明書を読み込む際に使用されます。

Windows ストアからの証明書

証明書がすでにWindows証明書ストアにインストールされている場合は、 証明書のサムプリントを 提供し、それがどこにあるかを指定してください。

サムプリントを確認するには、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 バージョン

SSLOptions.Version プロパティを使用して、サーバーが受け付ける TLS バージョンを制御します:

説明
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を受け入れます

暗号スイートリスト

デフォルトでは、SChannelはシステムの暗号構成を使用します。SChannel_Options.CipherListを コロン区切りのアルゴリズム名のリストに設定することで、許可される暗号を制限できます。例:

CALG_AES_256:CALG_AES_128

Windowsのデフォルトを使用するには、このプロパティを空のままにしてください。

レガシー資格情報

Windows Server 2019以前では、新しい SCH_CREDENTIALS APIがサポートされない場合があります。古いWindowsバージョンでサーバーの起動に失敗した場合は、レガシーの SCHANNEL_CRED 構造を使用するために SChannel_Options.UseLegacyCredentialsTrue に設定してください。

コンポーネントはほとんどの場合Windowsバージョンを自動的に検出しますが、必要に応じてレガシーモードを強制することもできます。

OpenSSL に対する利点

注意