サーバーでのクライアント認証の設定において、認証情報として証明書を利用する構成にすることができます。クライアント端末がサーバーに接続するためには、サーバー側が信頼している証明機関から発行された証明書を送信する必要があります。
クライアント認証の際に、クライアントへ「サーバーが信頼している証明機関の情報」を通知するための仕組みが証明書信頼リスト(CTL)です。CTL を構成することで、クライアント端末はサーバーへ誤った証明書を送信してしまうという動作を抑止することができます。
今回は、CTL の仕組みや構成方法について紹介します。
証明書信頼リスト(CTL)とは?
証明書信頼リスト(CTL:Certificate Trust List)とは、サーバーが信頼している証明機関の一覧となります。CTL を利用して通信相手に、サーバー自身が信頼している証明機関のリストを通知することができるようになります。
一般的に、CTL はクライアント認証が必要なサーバー上で利用されます。クライアント端末がサーバーへ接続してきたときに、サーバーはクライアント端末に CTL を送信して、サーバー自身が信頼している証明機関を通知します。クライアント端末は CTL を受け取ったら、CTL に含まれる証明機関から発行された証明書を認証情報として送信します。
もし、サーバーが信頼していない証明機関から発行された証明書を認証情報として送信しても、サーバー側では証明書の検証に失敗するため、クライアントはサーバーへの接続に失敗してしまいます。CTL により、クライアント端末が認証用に証明書を選択する時に、サーバーが検証できない証明書を送信することを抑止することができます。
Windows OS での CTL の有効化
Windows OS には、SSL/TLS 通信を処理する Schannel.dll というモジュールが用意されています。IIS など Windows Server の役割などでインストールできるアプリケーションでは、SSL/TLS の処理に Schannel.dll を利用します。Schannel .dll は既定では CTL を送信しない構成です。Schannel.dll を利用するアプリケーションにおいて、CTL を送信する構成に変更する場合には、以下のレジストリを設定する必要があります。
名前: SendTrustedIssuerList
型: REG_DWORD
値: 1
CTL 構成の仕組み
Windows OS にて SendTrustedIssuerList が 1 に設定されている場合、CTL を送信する構成となります。
CTL に含まれる「信頼している証明機関」の一覧は、以下の通りに決まります。
- 独自のストアを作成して、CTL として利用する構成にする
- 独自ストアが設定されていない場合、[クライアント認証発行者] のストアを CTL として利用する
- [クライアント認証発行者] に CA 証明書が登録されていない場合、[信頼されたルート証明機関] のストアを CTL として利用する
CTL として送信する証明機関を指定したい場合、任意の名前で独自の証明書ストアを作成し、その証明機関の CA 証明書を登録します。新規に証明書ストアを作成した後、netsh コマンドにてサーバー証明書のバインドの設定にて、独自の証明書ストアを CTL と紐づけることができます。
もし、サーバー証明書のバインドの設定にて、CTL の設定が特定のアプリケーションに紐づいていない場合は、まず [クライアント認証発行者] の証明書ストアを参照し、この証明書ストアに CA 証明書が登録されていた場合には、その CA 証明書を CTL に含めて送信します。もし、[クライアント認証発行者] の証明書ストアに CA 証明書が登録されていない場合は、次は [信頼されたルート証明機関] のストアを参照し、この証明書ストアに登録されている CA 証明書を送信します。
IIS での CTL の構成
IIS では [SSL 設定] にてクライアント証明書の認証を行う構成にすることができます。このクライアント認証にて、CTL を送信する設定にするには、レジストリ SendTrustedIssuerList の設定値を 1 に設定するのみで構成できます。
クライアント端末から認証情報として送信される証明書を、特定の証明機関から発行された証明書に限定するには、独自に証明書ストアを作成して、バインドの設定に紐づける手順が必要となります。
以下の手順は、独自の証明書ストアを作成して、CTL として構成する手順について詳細を紹介します。
1. サーバー証明書のバインド
IIS サーバーにて、特定のサイトにサーバー証明書をバインドします。
1) IIS サーバーに管理者権限をもつユーザーでログオンします。
2) [ファイル名を指定して実行] を開き、inetmgr と入力して [OK] をクリックします。
3) 画面の左ペインより、サーバー証明書をバインドする対象のサイトを右クリックして [バインドの編集] をクリックします。
4) [サイト バインド] にて、[追加] をクリックします。
5) [サイト バインドの追加] にて、[種類] に HTTPS を選択し、[SSL 証明書] の項目にサーバー証明書(SSL 証明書) として設定する証明書を選択し、[OK] をクリックします。
6) [サイト バインド] の画面を閉じます。
2. クライアント証明書の要求の設定
IIS サーバーにて、クライアント認証のために証明書を提示を要求する設定を有効にします。
1) IIS サーバーに管理者権限をもつユーザーでログオンします。
2) [ファイル名を指定して実行] を開き、inetmgr と入力して [OK] をクリックします。
3) 画面の左ペインより、サーバー証明書をバインドする対象のサイトの画面の中央ペインにて [SSL 設定] をダブルクリックします。
4) [SSL が必要] のチェックボックスを有効にし、[クライアント証明書] の項目にて [必要] を選択した後、[適用] をクリックします。
3. CTL 用の独自証明書ストアの作成
1) CTL に含めたい証明機関の CA 証明書のエクスポート ファイル(cer 形式)を用意します。
2) IIS サーバーに管理者権限をもつユーザーでログオンします。
3) IIS サーバー上の任意のフォルダに CA 証明書のエクスポート ファイルを保存します。
4) 管理者権限でコマンド プロンプトを開きます。
5) cd コマンドにて、CA 証明書のエクスポート ファイルを保存したフォルダに移動します。
6) 以下のコマンドを実行して、独自の証明書ストアを作成し、CA 証明書を登録します。
certutil -f -addstore <任意のストア名> <ルートCAの証明書>
実行例:
4. 証明書ストアを CTL に紐づけ
- IP:ポート
- 証明書ハッシュ
- アプリケーション ID
- 証明書ストア名
先ほどの実行結果の例の場合、メモしておくのは以下の値となります。
証明書ハッシュ : b90d66e4514927cda36e9032344fb66c4fed434e
アプリケーション ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
証明書ストア名 : My
netsh http add sslcert ipport=<IP:ポート> certhash=<証明書ハッシュ> appid=<アプリケーション ID> certstorename=MY sslctlstorename=<独自証明書ストア名>
5. レジストリ設定
名前: SendTrustedIssuerList
型: REG_DWORD
値: 1