まれに SSL/TLS 通信が bad mac record のエラーで失敗する

こんにちは。Windows プラット フォーム サポートの馬場です。

今回は、鍵交換を DHE 方式で行う場合に、Web サーバー等の SSL/TLS サーバーへの接続にまれに失敗する問題について紹介します。

 

どのような問題なのか?
-----------------------
Web サーバーへの HTTPS 通信など、SSL/TLS を用いてサーバーに接続することがあると思います。
この時、クライアント PC と非 Windows の TLS サーバー製品間の通信で、数百回に 1 回の頻度で SSL/TLS 通信に失敗するという事象が報告されています。

これは、SSL/TLS ハンドシェイクにおける鍵交換の際に、クライアントとサーバー間でやり取りされる public share もしくは premaster secret の先頭バイトに対する処理について、Windows OS や他ベンダーで差異があるためです。
その影響により、まれに TLS 通信が bad mac record のエラーで失敗します。

Windows OS ではこの処理の差異を、Windows 10 TH2 にて修正しており、サーバーでは Windows Server 2016 で修正済みです。
また、恐れ入りますが、Windows 8.1、Windows Server 2012 R2 以前の OS では修正による既存機能へ影響を考慮し、修正は見送られております。
なお、TLS に関する RFC において、DHE の鍵交換に関する動作は明確に規約が決められていない部分も多く、今回の問題以外の原因でも、各ベンダーの鍵交換に関する実装の差分に起因して、TLS ハンドシェイクに失敗する可能性が報告されております。
このため、TLS/SSL 通信において DHE を使用する際は、十分検証のうえ利用するか、事前にDHEが関連する暗号スイートを利用しないように、設計・運用いただくことを推奨いたします。

Windows OS において、DHE を使用しないように暗号スイートを構成する手順は以下の通りです。

 

対処策
-----------------------
1. サーバーにて、レジストリ エディターを管理者として起動します。

2.次のレジストリを右クリックし、[修正] を選択します。

キー  : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002
名前  : Functions
種類  : REG_MULTI_SZ

3. 次の DHE を含むすべての Cipher Suites を削除します。

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA

4. 設定を反映させるために OS を再起動します。

なお、上記設定はグループポリシーでも配布可能です。
上記設定で効果が確認できた場合は、ドメイン コントローラーにて以下の設定を実施ください。

1. ドメイン コントローラーでグループ ポリシーの管理を開きます。

2. 上記の暗号スイートの変更を配布したいクライアントマシンに適用される GPO を開きます。

3. [コンピューターの構成] - [ポリシー] - [管理用テンプレート] - [ネットワーク] - [SSL 構成設定] - [SSL 暗号の順位] を開きます。

4. [有効] を選択し、"オプション" の "SSL 暗号" の部分に表示された文字列をすべて選択してコピーし、一旦テキスト エディタに貼り付けます。

5. 上記の文字列の中の以下の DHE を含むすべての Cipher Suites を削除します。

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA

6. 編集したテキスト ファイルの内容で、上記 4. の "SSL 暗号" の内容を置き換えます。

7. [OK] を押して、設定を完了します。

クライアント側には、上記ポリシー設定が自動的に 1.5 から 2 時間で反映されます。
手動で適用する場合は、クライアント側で gpupdate /force コマンドを実行ください。
ポリシー適用後、念のためクライアント OS を再起動します。