トランスポート層セキュリティ (TLS) のレジストリ設定
この記事では、Schannel セキュリティ サポート プロバイダー (SSP) を介したトランスポート層セキュリティ (TLS) プロトコルと Secure Sockets Layer (SSL) プロトコルの Windows 実装でサポートされているレジストリ設定の情報について説明します。 この記事で説明するレジストリ サブキーとエントリは、SChannel SSP (特に TLS プロトコルと SSL プロトコル) の管理とトラブルシューティングに役立ちます。
注意事項
この情報は、トラブルシューティングを行うとき、または必要な設定が適用されていることを確認するときに参照してください。 他の手段がない限り、レジストリは直接編集しないことをお勧めします。 レジストリに対する変更は、レジストリ エディターまたは Windows オペレーティング システムによる検証は行われずに適用されます。 このため、不適切な値が設定される場合があり、これにより回復不能なシステム エラーが発生することがあります。 可能な場合は、レジストリを直接編集するのではなく、グループ ポリシー、Microsoft 管理コンソール (MMC) などの他の Windows ツールを使用します。 レジストリを編集する必要がある場合は、細心の注意が必要です。
SChannel のログ
システム イベント ログに保存され、イベント ビューアーを使用して表示できる SChannel イベントには、8 つのログ レベルがあります。 このレジストリ パスは、DWORD 値が 1 に設定された EventLogging キーの下のHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
に格納されます。
10 進数または 16 進数 | SChannel ログ イベント |
---|---|
0 | イベントなし |
1 | エラー イベント |
2 | 警告イベント |
3 | エラーと警告イベント |
4 | 情報と成功イベント |
5 | エラー、情報、成功イベント |
6 | 警告、情報、成功イベント |
7 | エラー、警告、情報、成功イベント |
Note
SChannel のログ レベルを変更したら、デバイスを再起動する必要があります。
CertificateMappingMethods
サーバー アプリケーションにクライアント認証が必要な場合、SChannel は、クライアント コンピューターによって指定された証明書をユーザー アカウントに自動的にマップしようとします。 クライアント証明書を使用してサインインするユーザーを認証するには、マッピングを作成します。これにより、証明書の情報が Windows ユーザー アカウントに関連付けられます。
証明書のマッピングを作成して有効にすると、そのユーザーは、クライアントがクライアント証明書を提示するたびに、サーバー アプリケーションによって適切な Windows ユーザー アカウントに自動的に関連付けられます。
ほとんどの場合、証明書は次の 2 つの方法のいずれかでユーザー アカウントにマップされます。
- 1 つの証明書が 1 つのユーザー アカウントにマップされる (1 対 1 のマッピング)
- 複数の証明書が 1 つのユーザー アカウントにマップされる (多対 1 のマッピング)
SChannel プロバイダーは、次の 4 つの証明書マッピング方法を使用します。
- Kerberos service-for-user (S4U) マッピング (既定で有効)
- ユーザー プリンシパル名マッピング
- 1 対 1 のマッピング (サブジェクト/発行者マッピングとも呼ばれます)
- 多対 1 のマッピング
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
エントリ名 | DWORD | 既定で有効 |
---|---|---|
Subject/Issuer | 0x000000001 | いいえ |
発行者 | 0x000000002 | いいえ |
UPN | 0x000000004 | いいえ |
S4U2Self | 0x000000008 | はい |
S4U2Self Explicit | 0x000000010 | はい |
該当するバージョン: この記事の冒頭にある Applies to リストで指定されています。
Ciphers
TLS/SSL 暗号は、暗号スイートの順序を構成して制御する必要があります。 詳細については、「TLS 暗号スイートの順序を構成する」を参照してください。
SChannel SSP によって使われる既定の暗号スイートの順序について詳しくは、「TLS/SSL (Schannel SSP) の暗号スイート」をご覧ください。
CipherSuites
TLS/SSL 暗号スイートの構成は、グループ ポリシー、MDM、または PowerShell を使用して行う必要があります。詳細については、「 TLS 暗号スイートの順序の構成 を参照してください。
SChannel SSP によって使われる既定の暗号スイートの順序について詳しくは、「TLS/SSL (Schannel SSP) の暗号スイート」をご覧ください。
ClientCacheTime
このエントリは、クライアントの TLS セッション キャッシュ項目の有効期間をミリ秒単位で指定します。 Windows Server 2008 と Windows Vista 以降では、既定値は 10 時間です。 値が 0 の場合、クライアントでの TLS セッションのキャッシュがオフになります。
クライアントが初めて SChannel SSP 経由でサーバーに接続すると、フル TLS/SSL ハンドシェイクが実行されます。 完了すると、マスター シークレット、暗号スイート、および証明書は、クライアントおよびサーバーそれぞれのセッション キャッシュに格納されます。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
EnableOcspStaplingForSni
オンライン証明書状態プロトコル (OCSP) のホチキス止めでは、TLS ハンドシェイク中に、インターネット インフォメーションサービス (IIS) などの Web サーバーからクライアントにサーバー証明書を送信するときに、サーバー証明書の現在の失効状態を提供できます。 この機能により、Web サーバーはサーバー証明書の現在の OCSP の状態をキャッシュし、それを複数の Web クライアントに送信できるため、OCSP サーバーの負荷が軽減されます。 この機能がないと、各 Web クライアントは OCSP サーバーからサーバー証明書の現在の OCSP の状態を取得しようとします。 これにより、その OCSP サーバーに高い負荷が発生します。
http.sys 上の Web サービスでは、IIS に加えて、Active Directory フェデレーション サービス (AD FS) や Web アプリケーション プロキシ (WAP) など、この設定のメリットを受けることもできます。
既定では、OCSP のサポートは、セキュリティで保護された (SSL/TLS) シンプル バインディング使用する IIS Web サイトで有効になっています。 ただし、IIS Web サイトで次の種類の SSL/TLS バインディングのいずれかまたは両方を使用している場合、このサポートは既定では有効になりません。
- Server Name Indication が必要
- 集中証明書ストアを使用する
この場合、TLS ハンドシェイク中のサーバー hello 応答には、既定で OCSP のホチキス止め状態は含まれません。 この動作によってパフォーマンスが向上します。Windows OCSP ホチキス止めの実装は、数百のサーバー証明書に拡張します。 ただし、サーバー名表示 (SNI) と中央証明書ストア (CCS) を使用すると、IIS は何千ものサーバー証明書を持つ可能性のある数千の Web サイトにスケーリングできるため、CCS バインドに対して OCSP ステープリングを有効にすると、パフォーマンスの問題が発生する可能性があります。
適用可能なバージョン: Windows Server 2012 と Windows 8 以降のすべてのバージョン。
レジストリ パス: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
次のキーを追加します。
"EnableOcspStaplingForSni"=dword:00000001
無効にするには、DWORD 値を 0 に設定します。
"EnableOcspStaplingForSni"=dword:00000000
Note
このレジストリ キーを有効にすると、パフォーマンスに影響する場合があります。
ハッシュ
TLS/SSL ハッシュ アルゴリズムは、暗号スイートの順序を構成して制御する必要があります。 詳細については、「TLS 暗号スイートの順序を構成する」を参照してください。
IssuerCacheSize
このエントリは、発行者のキャッシュのサイズを制御し、発行者のマッピングで使用されます。 SChannel SSP では、クライアント証明書の直接の発行者だけでなく、クライアントの証明書チェーンに含まれるすべての発行者をマップしようとします。 発行者がアカウントにマップされていない場合 (一般的なケース)、サーバーは同じ発行者名を繰り返しマップしようとすることがあり、その回数は 1 秒あたり数百回に及びます。
これを防ぐために、サーバーには負のキャッシュがあるため、発行者名がアカウントにマップされない場合はキャッシュに追加され、SChannel SSP はキャッシュ エントリの有効期限が切れるまで発行者名のマップを再試行しません。 このレジストリ エントリは、キャッシュ サイズを指定します。 既定では、このエントリはレジストリに存在しません。 既定値は 100 です。
適用可能なバージョン: Windows Server 2008 と Windows Vista 以降のすべてのバージョン。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
IssuerCacheTime
このエントリは、キャッシュ タイムアウト間隔をミリ秒単位で制御します。 SChannel SSP では、クライアント証明書の直接の発行者だけでなく、クライアントの証明書チェーンに含まれるすべての発行者をマップしようとします。 発行者がアカウントにマップされていない場合 (一般的なケース)、サーバーは同じ発行者名を繰り返しマップしようとすることがあり、その回数は 1 秒あたり数百回に及びます。
これを防ぐために、サーバーには負のキャッシュがあるため、発行者名がアカウントにマップされない場合はキャッシュに追加され、SChannel SSP はキャッシュ エントリの有効期限が切れるまで発行者名のマップを再試行しません。 パフォーマンス上の理由から、このキャッシュは保持されるため、同じ発行者はマップされなくなります。 既定では、このエントリはレジストリに存在しません。 既定値は 10 分です。
適用可能なバージョン: Windows Server 2008 と Windows Vista 以降のすべてのバージョン。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
KeyExchangeAlgorithm キーのサイズ
これらの次のエントリは、既定ではレジストリに存在しない可能性があり、手動で作成する必要があります。 キー交換アルゴリズムの使用は、暗号スイートの順序を構成して制御する必要があります。 TLS/SSL 暗号スイート暗号化アルゴリズムの詳細については、「TLS/SSL (Schannel SSP) の暗号スイート」を参照してください。
Windows 10 バージョン 1507 および Windows Server 2016 で追加されました。
レジストリ パス: HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman
TLS クライアントでサポートされる Diffie-Hellman キー ビット長の最小範囲を指定するには、 ClientMinKeyBitLength
エントリを作成します。 エントリを作成したら、DWORD 値を目的のビット長に変更します。 構成されていない場合は、1024 ビットが最小値になります。
注意
構成された楕円曲線によって、ECDHE キー交換の暗号の強度が決まります。 詳細については、「トランスポート層セキュリティ (TLS) を管理する」を参照してください。
MaximumCacheSize
このエントリは、キャッシュする TLS セッションの最大数を制御します。 MaximumCacheSize を 0
に設定すると、サーバー側のセッション キャッシュが無効にされ、セッションの再開が防止されます。 MaximumCacheSize を既定値より大きくすると、Lsass.exeが余分なメモリを消費します。 通常、各セッション キャッシュ要素には 2 KB から 4 KB のメモリが必要です。 既定では、このエントリはレジストリに存在しません。 既定値は 20,000 要素です。
適用可能なバージョン: Windows Server 2008 と Windows Vista 以降のすべてのバージョン。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
メッセージング – フラグメント解析
このエントリは、受け入れられる TLS ハンドシェイク メッセージの最大許容サイズを制御します。 許可されたサイズを超えるメッセージは受け入れられません。TLS ハンドシェイクは失敗します。 これらのエントリは、既定ではレジストリに存在しません。
値を 0x0
に設定すると、断片化されたメッセージは処理されず、TLS ハンドシェイクが失敗します。 これにより、現在のマシン上の TLS クライアントまたはサーバーが TLS RFC に非準拠になります。
最大許容サイズは、最大 2^16 バイトまで増やすことができます。 クライアントまたはサーバーがネットワークから大量の未確認のデータを読み取って格納することは良い考えではなく、セキュリティ コンテキストごとに余分なメモリを消費します。
Windows 7 および Windows Server 2008 R2 で追加: 断片化された TLS/SSL ハンドシェイク メッセージを Windows XP、Windows Vista、または Windows Server 2008 の Internet Explorer で解析できる更新プログラムを使用できます。
レジストリ パス: HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Messaging
TLS クライアントが受け入れるフラグメント化 TLS ハンドシェイク メッセージの最大許容サイズを指定するには、 MessageLimitClient
エントリを作成します。 エントリを作成したら、DWORD 値を目的のビット長に変更します。 構成されていない場合、既定値は 0x8000
バイトです。
クライアント認証がない場合に TLS サーバーが受け入れる断片化された TLS ハンドシェイク メッセージの最大許容サイズを指定するには、 MessageLimitServer
エントリを作成します。 エントリを作成したら、DWORD 値を目的のビット長に変更します。 構成されていない場合、既定値は 0x4000 バイトになります。
クライアント認証がある場合に TLS サーバーが受け入れるフラグメント化 TLS ハンドシェイク メッセージの最大許容サイズを指定するには、 MessageLimitServerClientAuth
エントリを作成します。 エントリを作成したら、DWORD 値を目的のビット長に変更します。 構成されていない場合、既定値は 0x8000 バイトになります。
SendTrustedIssuerList
TLS サーバーは、クライアント認証を要求するときに、受け入れ可能な証明機関の識別名の一覧を送信する場合があります。 これは、TLS クライアントが適切な TLS クライアント証明書を選択するのに役立ちます。 SChannel ベースの TLS サーバーでは、サーバーによって信頼されている証明機関がパッシブ オブザーバーに公開され、TLS ハンドシェイクの過程で交換されるデータの量も増加するため、この信頼された発行者リストは既定では送信されません。 この値を 1 に設定すると、SChannel ベースのサーバーでは、信頼された発行者のリストが送信されます。
信頼された発行者の一覧を送信しないと、クライアント証明書の要求時にクライアントが送信する内容に影響する可能性があります。 たとえば、Microsoft Edge がクライアント認証要求を受信するときに表示されるのは、サーバーによって送信された証明機関のいずれかにチェーンでつながっているクライアント証明書のみです。 サーバーが一覧を送信しなかった場合、Microsoft Edge には、クライアントにインストールされているすべてのクライアントの証明書が表示されます。
この動作が望ましいことがあります。 たとえば、PKI 環境にクロス証明書が含まれている場合、クライアント証明書とサーバー証明書のルート CA は同じになりません。 そのため、Microsoft Edge では、サーバーの CA のいずれかにチェーンされている証明書を選択できません。 TLS クライアントは、サーバーが信頼された発行者リストを送信しない場合に、使用可能なクライアント証明書を提供する場合があります。 既定では、このエントリはレジストリに存在しません。
信頼された発行者の一覧を送信する既定の動作
Windows のバージョン | 既定の動作 |
---|---|
Windows Server 2012、Windows 8 以降 | FALSE |
Windows Server 2008 R2、Windows Server 7 以前 | TRUE |
適用可能なバージョン: Windows Server 2008 と Windows Vista 以降のすべてのバージョン。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
ServerCacheTime
このエントリは、サーバー TLS セッション キャッシュ項目の有効期間をミリ秒単位で指定します。 既定値は 10 時間です。 値が 0 の場合、サーバー上の TLS セッション キャッシュがオフになり、セッションを再開できなくなります。 前の ServerCacheTime を増やすと、既定値によって Lsass.exe が消費するメモリ量が多くなります。 通常、各セッション キャッシュ要素には 2 KB から 4 KB のメモリが必要です。 既定では、このエントリはレジストリに存在しません。
適用可能なバージョン: Windows Server 2008 と Windows Vista 以降のすべてのバージョン。
レジストリ パス: HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
既定のサーバー キャッシュ時間: 10 時間
TLS、DTLS、SSL プロトコルのバージョン設定
SChannel SSP では、TLS、DTLS、および SSL プロトコルのバージョンを実装します。 Windows ごとに、異なる プロトコル バージョンがサポートされます。 システム全体で使用できる (D)TLS および SSL バージョンのセットは、AcquireCredentialsHandle 呼び出しで SCH_CREDENTIALS 構造を指定して、SSPI 呼び出し元で制限できます (拡張はできません)。 SSPI 呼び出し元では、プロトコルのバージョンを制限するのではなく、システムの既定値を使用することをお勧めします。
サポートされている (D)TLS または SSL プロトコルのバージョンは、次のいずれかの状態で存在できます。
- 有効: SSPI 呼び出し元が SCH_CREDENTIALS 構造体を使用してこのプロトコル バージョンを明示的に無効にしない限り、SChannel SSP はサポート ピアとこのプロトコル バージョンをネゴシエートする可能性があります。
- 無効: SChannel SSP は、SSPI 呼び出し元が指定する可能性がある設定に関係なく、このプロトコル バージョンをネゴシエートしません。
これらのレジストリ値は、次の形式を使用して、名前付きのレジストリ サブキーの下のプロトコル クライアントロールとサーバー ロールに対して個別に構成されます。
<SSL/TLS/DTLS> <major version number>.<minor version number><Client\Server>
これらのバージョン固有のサブキーは、次のレジストリ パスの下に作成できます。
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
たとえば、バージョン固有のサブキーが含まれる有効なレジストリ パスを次に示します。
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\DTLS 1.2\Client
システムの既定値をオーバーライドし、サポートされている (D)TLS または SSL プロトコルのバージョンをEnabled
状態に設定するには、対応するバージョン固有のサブキーの下にエントリ値 "1" Enabled
という名前の DWORD レジストリ値を作成します。
次の例では、TLS 1.0 クライアントが [有効] 状態に設定されています。
システムの既定値をオーバーライドし、サポートされている (D)TLS または SSL プロトコルのバージョンを Disabled
状態に設定するには、対応するバージョン固有のサブキーの下で、 Enabled
の DWORD レジストリ値を "0" に変更します。
次の例では、レジストリで DTLS 1.2 が無効になっています。
(D)TLS または SSL プロトコルのバージョンを Disabled
状態に切り替えると、 AcquireCredentialsHandle 呼び出しが失敗する可能性があります。これは、システム全体で有効になっているプロトコル バージョンがなく、同時に特定の SSPI 呼び出し元によって許可されているためです。 さらに、 Enabled
(D)TLS と SSL のバージョンのセットを減らすと、リモート ピアとの相互運用性が損なわれます。
(D)TLS または SSL プロトコルのバージョン設定を変更すると、後続の AcquireCredentialsHandle 呼び出しによって開かれる資格情報ハンドルを使用して確立された接続で有効になります。 (D)TLS と SSL のクライアントおよびサーバー アプリケーションとサービスは、パフォーマンス上の理由から、複数の接続に対して資格情報ハンドルを再利用する傾向があります。 これらのアプリケーションで資格情報ハンドルを再取得するには、アプリケーションまたはサービスの再起動が必要な場合があります。
これらのレジストリ設定は SChannel SSP にのみ適用され、システムにインストールされる可能性のあるサード パーティ (D) TLS および SSL の実装には影響しません。
警告
サポートされていない構成によって発生する可能性のある潜在的なリスクや意図しない結果を理由に、この記事で明示的に詳しく説明されていない SChannel レジストリ設定の作成または調整は推奨されていません。
PowerShell を使用した TLS 暗号スイートの管理については、TLS コマンド リファレンスを参照してください。 グループ ポリシーを使用した TLS 設定の管理に関心がある場合は、「グループ ポリシーを使用して TLS 暗号スイートの順序を構成する」を参照してください。