【解決方法】システム イベント ID 36887 / 36888 (Schannel) について

PKI

システム イベント (ソース:Schannel) ID 36887/36888 は SSL/TLS 通信に関するエラー イベント ログです。
今回は、ID 36887/36888 のイベント ログの意味や確認すべきポイントについて紹介します。

この問題を解決するには、SSL/TLS の基本知識が必要です。
また、SSL/TLS の一般的な仕組みについては、以下の記事で紹介していますのでご参照ください。

関連記事

インターネット上で通信を暗号化して送信し、他の人に見られないように安全に通信を行うためのプロトコルである SSL/TLS の概要について説明します。 SSL/TLS とは SSL/TLS とはインターネット等の通信ネットワークにおいて、[…]

関連記事

SSL/TLS では暗号化通信を開始する前に、SSL/TLS ハンドシェイクと呼ばれるやりとりを行い、暗号化通信を行うにあたって必要な情報を交換し、暗号化通信を確立します。 SSL/TLS ハンドシェイクにて、クライアントとサーバー間で暗[…]

 

イベント ID 36887/36888 の概要

システム イベント ログに以下のようなエラー ログが記録されていることがあります。

ログの名前: System
ソース: Schannel
日付: YYYY/MM/DD HH:MM:SS
イベント ID: 36888
タスクのカテゴリ: なし
レベル: エラー
キーワード:
ユーザー: SYSTEM
コンピューター: <コンピューター名>
説明:
致命的な警告が生成され、リモート エンドポイントに送信されました。これにより接続が終了する可能性があります。TLS プロトコルで定義された致命的な警告コードは XX です。
ログの名前: System
ソース: Schannel
日付: YYYY/MM/DD HH:MM:SS
イベント ID: 36887
タスクのカテゴリ: なし
レベル: エラー
キーワード:
ユーザー: SYSTEM
コンピューター: <コンピューター名>
説明:
リモート エンドポイントから致命的な警告を受け取りました。TLS プロトコルで定義されているこの致命的な警告のコードは XX です。
このエラー ログは SSL/TLS 通信の確立に失敗したことを示すエラー ログです。
SSL/TLS 通信の途中で問題が発生し、SSL/TLS 通信の確立に失敗しています。
 
ID 36888
TLS 通信の途中で、自身がエラーを検知して TLS 通信の確立を中断した状況だったことを示しています。
ID 36887
TLS 通信の途中で、相手がエラーを検知して TLS 通信の確立を中断した状況となります。
SSL/TLS 通信に失敗しただけとなり、コンピューターに問題があるわけではありません。
これらのエラー ログの原因となった SSL/TLS 通信が、不要な通信である可能性もあります。
そのため、このエラー ログが記録されたタイミングにおいて、特に問題が発生していない場合は無視して問題ありません

このエラー ログは、 SSL/TLS 通信に関連する何らかの問題が発生している時に着目すべきログです。
例えば、HTTPS サイトにアクセスできない、リモートデスクトップ接続できない等の問題が発生している場合です。
SSL/TLS 通信が関連している問題の場合、SSL/TLS 通信に失敗したことが原因である可能性があります。
その場合、ID 36887/36888 エラー ログをもとに原因調査を進めることができます。
 

警告コード一覧

イベント ID 36887/36888 エラー ログの説明に警告コードが記載されています。
この警告コードは TLS Alert メッセージで通知されるエラー コード(数字)です。

TLS Alert とは、TLS ハンドシェイクや TLS 通信中に、問題が発生したことを通信相手に通知するものです。
TLS 通信において、途中で失敗する要因は様々なものが想定されます。
そのため、TLS の警告プロトコルで、想定される一般的な要因を示すエラー コードを定義しています。

定義されているエラーの一覧は以下の通りです。

コード

メッセージ内容

レベル

説明

0

Close notify

warning/fatal

コネクションの終了を通知

10

Unexpected message

fatal

不正なメッセージを受信

20

Bad record MAC

fatal

メッセージ認証コード(MAC)が不正

21

Decryption failed

fatal

復号に失敗

22

Record overflow

fatal

上限を超えたサイズのメッセージを受信

30

Decompression failure

fatal

圧縮データの伸長に失敗

40

Handshake failure

fatal

SSL/TLS ハンドシェイクに失敗

41

No certificate

warning/fatal

証明書なし

42

Bad certificate

warning/fatal

不正な証明書、破損した証明書

43

Unsupported certificate

warning/fatal

サポートしていない証明書

44

Certificate revoked

warning/fatal

失効された証明書

45

Certificate expired

warning/fatal

有効期限が切れた証明書

46

Certificate unknown

warning/fatal

証明書の処理中に何らかの問題が発生して受理できない

47

Illegal parameter

fatal

不正なパラメーターを受信

48

Unknown CA

fatal

信頼していない証明機関から発行された証明書

49

Access denied

fatal

証明書の受領の結果、アクセスを拒否

50

Decode error

fatal

メッセージの長さに異常があるなど、メッセージの復号不可

51

Decrypt error

warning/fatal

復号エラー

60

Export restriction

fatal

輸入規制に従わないネゴシエーションが行われたことを通知

70

Protocol version

fatal

サポートしないプロトコル バージョン

71

Insufficient security

fatal

パラメーターのセキュリティ強度が不十分

80

Internal error

fatal

SSL/TLS の処理とは関係ない内部エラーで接続を継続できないことを通知

90

User canceled

fatal

ハンドシェイク中にユーザーがキャンセル

100

No renegotiation

warning

再接続時におけるパラメーター変更の不可を通知

110

Unsupported extension

warning

Extension 項目をサポートしていない

111

Certificate unobtainable

warning

証明書を入手できない

112

Unrecognized name

warning

名前を認識できない

113

Bad certificate status response

fatal

OCSP 応答の結果が不正

114

Bad certificate hash value

fatal

証明書の署名が不正

115

Unknown PSK identity (used in TLS-PSK and TLS-SRP)

fatal

PSK(事前共有鍵)が不明

※ エラー コードにはレベルが指定されており、warningfatal があります。
fatal(=致命的)のエラー コードの TLS Alert メッセージを受領すると、双方はコネクションを閉じます。

 

TLS 通信に失敗する理由を調査する時、警告コードの内容がヒントになります。
警告コードの内容をもとに、適切な対処策を実施していただければと思います。

 

パケット解析ツール:Wireshark

TLS 通信に失敗する理由を調査する場合、その通信のパケット キャプチャーの解析が必要です。
TLS 通信のパケットの解析は、Wireshark がおすすめです。

オープンソースのパケット解析ツール:Wireshark
https://www.wireshark.org/

その他、パケット解析ツールとして、マイクロソフト製の Network Monitor があります。
ただし、SSL/TLS 通信のパケット解析という観点ではおすすめしません。

Network Monitor では、TLS ハンドシェイクに使われる拡張項目など正しく解釈されない項目があり、バイナリ表示となることがあります。

例えば、、、
Client Hello Extension の signature_algorithms の表示を見比べてみましょう。

Network Monitor

signature_algorithms の値が “Binary Large Object” と表示されています。
Network Monitor がパケットのバイナリデータを変換しないため、バイナリからアルゴリズム一覧を解釈する必要があります。
署名アルゴリズムは、ハッシュアルゴリズム(1バイト)、公開鍵暗号方式(1バイト) の計2バイトで表現されます。
バイナリデータの 0x4(SHA256) 0x3(ECDSA)、0x08(RSASSA-PSS) 0x04(SHA256)、0x4(SHA256) 0x1(RSA)、0x5(SHA384) 0x3(ECDSA) … と解釈していきます。

Wireshark

一方、Wireshark では、signature_algorithms の値は解析ツールの方で自動解釈して署名アルゴリズムを表記してくれます。
そのため、バイナリデータからサポートしている署名アルゴリズムの一覧を解釈する必要はありません。

 

拡張項目に含まれるべきデータを把握しており、バイナリ表記でも意味を理解できる上級者であれば Network Monitor でも問題ないと思います。
ただ、慣れるまで時間がかかるので、普通に Wireshark を利用する方がおすすめです。

 

トラブルシューティング事例

Handshake failure (40)

Handshake failure (40) は、TLS ハンドシェイクに失敗したことを示します。
指定されたセキュリティ アルゴリズムのセットに、利用できるものがないことを通知したものです。

これは、通信相手が提示してきた暗号スイートの中に、利用できるものがないことを意味しています。
クライアントとサーバーの双方が利用可能な暗号スイートを利用できるようにすることで、問題は解決します。

Client Hello:

これはクライアントが送信した Client Hello です。
クライアント自身が利用可能な暗号スイートの一覧を列挙してサーバーに通知します。

Server Hello:

これはサーバーが送信した Server Hello です。
Client Hello に含まれる暗号スイート一覧の中から、サーバー自身も利用可能な暗号スイートを 1 つ選択してクライアントに通知します。
ここで選択された暗号スイートのアルゴリズムを利用して、暗号化通信を行います。

クライアントが提示した暗号スイート一覧の中に、サーバーが利用できる暗号スイートがない状態となります。
そのため、正常にアクセスできる端末で採取したパケット、アクセスできない端末で採取したパケットを比較します。
正常系のログから、どの暗号スイートがサーバーが利用可能なのかを特定します。
特定した暗号スイートを利用できるように、クライアント端末の暗号スイートの設定を変更してください。

暗号スイートとは何か?暗号スイートの設定変更方法については、以下の記事で紹介しております。

関連記事

SSL/TLS にてデータを暗号化して通信を行うには、自分自身と通信相手の両方が利用可能なアルゴリズムを使う必要があります。 不特定の相手と両者が利用可能なアルゴリズムを確認しあうために使われるのが 暗号スイート(cipher suite[…]

 

Unknown CA (48)

Unknown CA (48) は、サーバー証明書が不明な証明機関(CA)から発行されたことを示します。

TLS ハンドシェイク中に、サーバーの信頼性を確認するためにサーバー証明書が提示されます。

クライアントは、サーバー証明書が信頼される証明機関から発行されているかどうかを確認します。
証明書チェーンをたどっていき、最上位にあるルート証明書がクライアントが信頼している必要があります。
これは、ルート証明書がクライアントの [信頼されたルート証明機関] ストアに登録されているかどうかです。

ルート証明書が [信頼されたルート証明機関] ストアに登録されていないと、サーバー証明書は信頼されません。
サーバー証明書が不明な証明機関から発行されたとみなされ、Unknown CA (48) エラーを通知します。

ルート証明書を [信頼されたルート証明機関] ストアに登録することで、問題は解決します。

Certificate:

これはサーバーが送信した Certificate です。
Certificate パケットでは、サーバー証明書と中間証明書の順でチェーンで送信されてくることが一般的です。
(中間証明書は省略されることもあります。サーバー側の設定次第です。)

証明書チェーンは降順で送信され、ルート証明書は送信されません。
上のパケットの画面キャプチャの場合、①サーバー証明書、②中間証明書の順となります。

下位の図でいうと、①サーバー証明書⇒②中間証明書⇒③中間証明書の順で送信されます。

ルート証明書の特定は、③の中間証明書の発行元機関キー識別子の情報をもとに特定します

③中間証明書はルート証明機関から発行された証明書となります。
そのため、③の中間証明書の発行元はルート証明機関の名前となります。

また、機関キー識別子とは、発行元の証明機関の公開鍵の識別子を指定するものです。
そのため、③の中間証明書の機関キー識別子=ルート証明書のサブジェクト キー識別子となります。


issuer が発行元の証明機関の名前(CA 名)です。
  AuthorityKeyIdentifier が機関キー識別子です。これがルート証明書のサブジェクト キー識別子と一致します。

該当するルート証明書を入手し、[信頼されたルート証明機関] にインストールしてください。

 

Protocol version (70)

Protocol version (70) は、指定されたプロトコル バージョンが利用できないことを示します。

TLS ハンドシェイクの過程で、自身が利用したいプロトコル バージョンを指定します。
クライアントは Client Hello、サーバーは Server Hello でプロトコル バージョンを指定しています。

通信相手が指定したプロトコル バージョンをサポートしていない場合、Protocol version (70) エラーを通知します。
相手がサポート指定しているプロトコル バージョンを有効にすることで、問題は解決します。

Client Hello:

Server Hello:

Handshake Protocol の項目の Version を確認してください。(Record Layer の Version は確認対象ではありません)

Protocol version(70)エラーは、バージョンが低いことが原因である可能性が高いです。
SSL 3.0 や TLS 1.0 などは脆弱性が見つかっており、古いバージョンを有効にするのはおすすめしません。
 

補足

ID 36888 エラーには “内部エラー” が記載されていることがあります。
これは Windows OS で検知した問題の詳細を示す内部エラーとなります。
ただし、内部エラーの意味は公開されおりませんので、マイクロソフトに問い合わせてください。