SChannel Indy サーバー Delphi

· 機能

長年にわたり、Windows に TLS 対応サーバーをデプロイする Delphi 開発者は同じ課題に直面してきました。アプリケーションに正しい OpenSSL ライブラリをバンドルすること、バージョンの不一致、実行時の DLL の欠落、セキュリティアドバイザリ後の手動更新など、本番環境での摩擦の絶えない原因でした。

Starting with sgcWebSockets 2026.3.0, Indy-based server コンポーネント — TsgcWebSocketServer and TsgcWebSocketHTTPServer — can use Windows SChannel (Secure Channel) as the TLS provider. SChannel is the native Windows TLS implementation built into every version of Windows. It requires no external DLLs, integrates directly with the Windows Certificate Store, and receives security patches automatically through Windows Update.

この記事では、Delphi アプリケーションで SChannel ベースのサーバーを設定・デプロイする方法を説明します。

サーバーサイドに SChannel を使用する理由

SChannel は Windows サーバーでの TLS に関連する最も一般的なデプロイの問題を解消します。

外部依存関係ゼロ
SChannel は Windows に組み込まれています。libeay32.dll、ssleay32.dll、libcrypto、libssl は不要です。インストーラーが小さくなり、デプロイが簡単になります。
Windows 証明書ストア
OS によってインストール・管理されている証明書をそのまま使用できます。PEM ファイルをコピーする必要はなく、拇印で証明書を参照するだけです。
自動セキュリティ更新
TLS の改善とセキュリティパッチは Windows Update を通じて適用されます。ライブラリの手動アップグレードや OpenSSL CVE のための再デプロイは不要です。

クイックスタート — 5 ステップ

サーバーで SChannel を有効化するには、いくつかのプロパティ変更だけで済みます:

  1. SSL を有効化SSL プロパティを True に設定します。
  2. IOHandler として SChannel を選択SSLOptions.IOHandleriohSChannel に設定します。
  3. TLS バージョンを選択SSLOptions.Version を目的のバージョンに設定します。ほとんどのデプロイでは tls1_2 を推奨します。
  4. ポートを設定SSLOptions.PortPort をリスニングポート(通常は 443)に設定します。
  5. 証明書を設定 — Windows 証明書ストア(拇印)または PFX ファイル経由で証明書を指定します。

方法 1:Windows ストアからの証明書

証明書がすでに Windows 証明書ストアにインストールされている場合は、拇印を指定するだけです。これは本番サーバーや Windows サービスに推奨されるアプローチです。

証明書の拇印を確認する

PowerShell を開き、ローカルマシンの個人ストアの証明書を一覧表示します:

PS C:\> dir cert:\localmachine\my
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com
A7F3D2E1B9C84A6D5E0F123456789ABCDEF01234  CN=api.mydomain.com

使用する証明書の 40 文字の16進数拇印をコピーします。

サーバーを設定する

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Point to the certificate in the Windows Store
  oServer.SSLOptions.SChannel_Options.CertHash :=
    'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
  oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
  oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
  // Start listening
  oServer.Active := True;
end;

本番環境のヒント。Windows サービスとしてデプロイするサーバーには常に scspStoreLocalMachine を使用してください。ローカルマシンストアはサービスを実行するユーザーアカウントに関わらずアクセスできますが、scspStoreCurrentUser はログイン中のユーザープロファイルに紐付けられます。

証明書ストアのオプション

ストア名 定数 内容
個人 (MY) scsnMY 秘密鍵付きサーバー証明書
ルート scsnRoot 信頼されたルート証明機関
信頼 scsnTrust 信頼された証明書
CA scsnCA 中間証明機関

方法 2:PFX ファイルからの証明書

PFX(.pfx または .p12)証明書ファイルがある場合は、Windows 証明書ストアにインストールせずに直接読み込めます。SChannel はサーバー起動時に証明書をインポートします。

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Load certificate from a PFX file
  oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
  oServer.SSLOptions.Password := 'mypassword';
  // Start listening
  oServer.Active := True;
end;

PEM ファイルをお持ちの場合。SChannel は PFX 形式のみ受け付けます。PEM 証明書と秘密鍵を以下のコマンド 1 つで変換できます:

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

SChannel_Options リファレンス

SSLOptions.SChannel_Options サブプロパティで SChannel 固有のすべてのサーバー設定を公開します。

プロパティ 説明
CertHash String Windows 証明書ストアにインストールされた証明書の 40 文字の16進数拇印。
CertStoreName Enum 検索するストア:scsnMY(個人)、scsnRootscsnTrustscsnCA
CertStorePath Enum ストアの場所:scspStoreLocalMachine(推奨)または scspStoreCurrentUser
CipherList String 許可する暗号アルゴリズムのコロン区切りリスト(例:CALG_AES_256:CALG_AES_128)。空白にすると Windows デフォルトを使用します。
UseLegacyCredentials Boolean True の場合、レガシー SCHANNEL_CRED 構造体を使用します。Windows Server 2019 以前で有効にします。

TLS バージョン設定

SSLOptions.Version プロパティでサーバーが受け付ける TLS プロトコルバージョンを制御します。

プロトコル 推奨事項
tls1_3 TLS 1.3 最高のセキュリティ。すべてのクライアントがサポートしている場合に使用します。
tls1_2 TLS 1.2 ほとんどの本番デプロイに推奨
tls1_1 TLS 1.1 レガシー。古いクライアントで必要な場合を除き使用しないでください。
tls1_0 TLS 1.0 非推奨。使用しないでください。
tlsUndefined TLS 1.0 – 1.2 TLS 1.0、1.1、または 1.2 のいずれかを受け付けます。
// Enforce TLS 1.2 minimum for modern security
oServer.SSLOptions.Version := tls1_2;
// Or use TLS 1.3 for the strongest encryption
oServer.SSLOptions.Version := tls1_3;

暗号スイート設定

デフォルトでは、SChannel は Windows が管理するシステム全体の暗号設定を使用します。より厳密な制御が必要な環境では、許可するアルゴリズムを制限できます。

// Restrict to AES-256 and AES-128 only
oServer.SSLOptions.SChannel_Options.CipherList :=
  'CALG_AES_256:CALG_AES_128';

Windows デフォルトの暗号設定を使用するには CipherList プロパティを空のままにします。Windows は Windows Update を通じて更新される安全なデフォルトセットを維持しているため、ほとんどのデプロイに適しています。

注意。暗号を過度に制限すると、一部のクライアントが接続できなくなる可能性があります。本番環境でカスタム暗号リストをデプロイする前に、想定されるクライアントベースで十分にテストしてください。

レガシー Windows との互換性

コンポーネントはデフォルトで最新の SCH_CREDENTIALS API を使用します。この API をサポートしない古い Windows バージョン(Server 2019 以前)では、レガシー認証情報構造体にフォールバックできます。

// Enable legacy mode for Windows Server 2019 and earlier
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;

ほとんどの場合、コンポーネントは Windows バージョンを自動検出して適切な API を選択します。古い Windows バージョンでサーバーの起動に失敗した場合にのみ UseLegacyCredentials プロパティを使用してください。

SChannel vs. OpenSSL — それぞれの使い分け

どちらの TLS プロバイダーも完全にサポートされています。適切な選択はデプロイプラットフォームと運用要件によって異なります。

機能 SChannel OpenSSL
外部 DLL が必要 不要 必要
Windows 証明書ストア ネイティブ対応 非対応
自動セキュリティ更新 あり(Windows Update) ライブラリの手動更新
クロスプラットフォーム Windows のみ Windows・Linux・macOS
証明書形式 PFX + Windows ストア PEM・PFX
TLS 1.0 〜 1.3 対応 対応

まとめ。サーバーが Windows 専用であれば、SChannel がよりシンプルでメンテナンスしやすい選択肢です。クロスプラットフォームサポートが必要な場合は iohOpenSSL を使用してください。両者の切り替えは IOHandler プロパティを変更するだけで済み、他のコード変更は不要です。

完全な例:セキュア WebSocket サーバー

Windows 証明書ストアの証明書を使用した SChannel による完全設定済み WebSocket サーバーの例です。

uses
  sgcWebSocket_Server, sgcWebSocket_Classes;
var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // Server configuration
    oServer.Port := 443;
    // TLS configuration with SChannel
    oServer.SSL := True;
    oServer.SSLOptions.IOHandler := iohSChannel;
    oServer.SSLOptions.Version := tls1_2;
    oServer.SSLOptions.Port := 443;
    // Certificate from Windows Certificate Store
    oServer.SSLOptions.SChannel_Options.CertHash :=
      'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
    oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
    oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
    // Assign WebSocket event handlers
    oServer.OnConnect := OnClientConnect;
    oServer.OnDisconnect := OnClientDisconnect;
    oServer.OnMessage := OnClientMessage;
    // Start the server
    oServer.Active := True;
    WriteLn('Secure WebSocket server listening on port 443 (SChannel TLS 1.2)');
    WriteLn('Press Enter to stop...');
    ReadLn;
  Finally
    oServer.Active := False;
    oServer.Free;
  End;
end;

両方のサーバーコンポーネントに対応

SChannel は両方の Indy ベースサーバーコンポーネントで利用できます。設定は同一です。

コンポーネント 説明
TsgcWebSocketHTTPServer HTTP サーバー内蔵の WebSocket サーバー。WebSocket + REST API の組み合わせに最適。
TsgcWebSocketServer Indy TCP ベースの純粋な WebSocket サーバー。専用 WebSocket エンドポイントに最適。

重要な注意事項