長年にわたり、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 を有効化するには、いくつかのプロパティ変更だけで済みます:
- SSL を有効化 —
SSLプロパティをTrueに設定します。 - IOHandler として SChannel を選択 —
SSLOptions.IOHandlerをiohSChannelに設定します。 - TLS バージョンを選択 —
SSLOptions.Versionを目的のバージョンに設定します。ほとんどのデプロイではtls1_2を推奨します。 - ポートを設定 —
SSLOptions.PortとPortをリスニングポート(通常は 443)に設定します。 - 証明書を設定 — 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(個人)、scsnRoot、scsnTrust、scsnCA。 |
| 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 エンドポイントに最適。 |
重要な注意事項
- Windows 専用。SChannel は Windows API です。クロスプラットフォームサーバー(Linux・macOS)には OpenSSL(
iohOpenSSL)を使用してください。 - 秘密鍵が必要。サーバー証明書には秘密鍵が含まれている必要があります。Windows 証明書ストアを使用する場合、証明書は秘密鍵と共にインポートされている必要があります。
- PFX 形式のみ。SChannel は PFX(.pfx / .p12)証明書ファイルを受け付けます。PEM ファイルがある場合は、
openssl pkcs12コマンドで最初に PFX に変換してください。 - サービスにはローカルマシンストアを使用。本番サーバーには
scspStoreLocalMachineを使用して、ユーザーアカウントに関わらず証明書にアクセスできるようにしてください。 - エディションの可用性。サーバーサイド SChannel は sgcWebSockets の Professional・Enterprise・All-Access エディションで利用できます。
