【PKI】証明書信頼リスト(CTL)とは?WindowsでCTLを構成する手順を詳説!

  • 2022年9月19日
  • 2022年9月19日
  • PKI
PKI

サーバーでのクライアント認証の設定において、認証情報として証明書を利用する構成にすることができます。クライアント端末がサーバーに接続するためには、サーバー側が信頼している証明機関から発行された証明書を送信する必要があります。

クライアント認証の際に、クライアントへ「サーバーが信頼している証明機関の情報」を通知するための仕組みが証明書信頼リスト(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 を送信する構成に変更する場合には、以下のレジストリを設定する必要があります。

レジストリ キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel
名前: SendTrustedIssuerList
型: REG_DWORD
値: 1
※レジストリ設定後の OS の再起動は不要です。
 
Windows Server 2012 / Windows 8 から、SendTrustedIssuerList の既定値が 0 に変更されております。それ以前の OS では、SendTrustedIssuerList の既定値は 1 であり、既定で CTL を送信する構成でした。
 
 

CTL 構成の仕組み

Windows OS にて SendTrustedIssuerList が 1 に設定されている場合、CTL を送信する構成となります。
CTL に含まれる「信頼している証明機関」の一覧は、以下の通りに決まります。

  1. 独自のストアを作成して、CTL として利用する構成にする
  2. 独自ストアが設定されていない場合、[クライアント認証発行者] のストアを CTL として利用する
  3. [クライアント認証発行者] に 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の証明書>

実行例:

certutil -f -addstore IISCTL rootcert.cer
この実行例の場合、IISCTL という名前の証明書ストアを作成して、そのストアに CA 証明書(rootcert.cer)が保存されます。
 

4. 証明書ストアを CTL に紐づけ

netsh コマンドにてサーバー証明書のバインドの設定にて、独自の証明書ストアを CTL と紐づけることができます。
1) IIS サーバーに管理者権限をもつユーザーでログオンします。
2) 管理者権限でコマンド プロンプトを開きます。
3) 以下のコマンドを実行し、HTTP 設定を確認します。
    netsh http show sslcert
実行結果の例:
 
4) コマンドの実行結果より、[SSL 証明書のバインド] の以下の項目の値をメモします。
  • IP:ポート
  • 証明書ハッシュ
  • アプリケーション ID
  • 証明書ストア名

 

先ほどの実行結果の例の場合、メモしておくのは以下の値となります。

IP:ポート : 0.0.0.0:443
証明書ハッシュ : b90d66e4514927cda36e9032344fb66c4fed434e
アプリケーション ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
証明書ストア名 : My
 
5) 以下のコマンドを実行し、SSL バインドを削除します。
    netsh http delete sslcert ipport=<IP:ポート>
 
実行例
netsh http delete sslcert ipport=0.0.0.0:443
※作業 4 にてメモした「IP:ポート」の値を指定します。
 
6) 以下のコマンドを実行し、CTL となる証明書ストアを紐づけして、SSL バインドを再作成します。

    netsh http add sslcert ipport=<IP:ポート> certhash=<証明書ハッシュ> appid=<アプリケーション ID> certstorename=MY sslctlstorename=<独自証明書ストア名>

 
実行例
netsh http add sslcert ipport=0.0.0.0:443 certhash=b90d66e4514927cda36e9032344fb66c4fed434e appid={4dc3e181-e14b-4a21-b022-59fc669b0914} certstorename=MY sslctlstorename=IISCTL
 
7) コマンドを実行したら、HTTP 設定にて CTL が構成されていることを確認します。
    netsh http show sslcert
実行結果の例:
 

5. レジストリ設定

SendTrustedIssuerList を設定して、CTL を送信する構成に設定します。
1) IIS サーバーに管理者権限をもつユーザーでログオンします。
2) [ファイル名を指定して実行] を開き、regedit と入力して [OK] をクリックします。
3) 以下のレジストリにレジストリを設定します。
レジストリ キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel
名前: SendTrustedIssuerList
型: REG_DWORD
値: 1
※ SendTrustedIssuerList は既定では存在しないレジストリ値となります。レジストリ エディタ上で値を新規作成して、レジストリを設定してください。