SSL 関連の問題のトラブルシューティング (サーバー証明書)

適用対象: インターネット インフォメーション サービス 6.0、インターネット インフォメーション サービス 7.0 以降のバージョン

概要

この記事は、インターネット インフォメーション サービス (IIS) のみに関連する Secure Sockets Layer (SSL) の問題のトラブルシューティングに役立ちます。 サーバー認証用のサーバー証明書について説明し、クライアント証明書については説明しません。

[クライアント証明書] セクションが [必須] に設定されている場合に問題が発生した場合、これは参照する必要がある記事ではありません。 この記事は、SSL サーバー証明書の問題のトラブルシューティングのみを目的としています。

すべての証明書が公開キー (暗号化に使用) と秘密キー (暗号化解除に使用) で構成されていることを理解することが重要です。 秘密キーは、サーバーのみが把握します。

HTTPS の既定のポートは 443 です。 SSL ハンドシェイク中の SSL ハンドシェイクとサーバー認証プロセスに精通していることを前提としています。

このトラブルシューティング ツールで使用されるツール

さまざまなシナリオのトラブルシューティングに使用されるツールは次のとおりです。

  • SSLDiag
  • ネットワーク モニター 3.4 または Wireshark

シナリオ

HTTPS 経由で Web サイトを参照しているときに、次のエラー メッセージが表示されます。

Internet Explorer で Web ページを表示できないというメッセージを示すブラウザー ページのスクリーンショット。

最初に確認する必要がある前提条件は、Web サイトに HTTP 経由でアクセスできるかどうかです。 そうでない場合は、この記事では説明されていない別の問題がある可能性があります。 このトラブルシューティング ツールを使用する前に、WEB サイトが HTTP で動作している必要があります。

次に、WEB サイトに HTTP 経由でアクセスでき、HTTPS 経由で参照しようとすると前のエラー メッセージが表示されると仮定します。 SSL ハンドシェイクに失敗したため、エラー メッセージが表示されます。 次のいくつかのシナリオで詳しく説明されている多くの理由が考えられます。

シナリオ 1

サーバー証明書に対応する秘密キーがあるかどうかを確認します。 [証明書] ダイアログの次のスクリーンショットを参照してください。

[証明書] ダイアログの 2 つのスクリーンショット。秘密キーがありません。もう 1 つには、秘密キーが証明書に対応していることを示すメッセージが表示されます。

解決方法

秘密キーがない場合は、秘密キーを含む証明書を取得する必要があります。これは基本的に .PFX ファイル。 秘密キーを証明書に関連付けるために実行できるコマンドを次に示します。

C:\>certutil - repairstore my "[U+200E] 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33"

certutil 構文を示すコマンド コンソールのスクリーンショット。

関連付けが成功すると、次のウィンドウが表示されます。

コマンドが正常に完了したことを示すメッセージを示すコマンド コンソールのスクリーンショット。

この例では、 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33 は証明書の拇印です。 拇印を取得するには:

  1. 証明書を開きます。
  2. 詳細タブを選択します。
  3. 下にスクロールして拇印セクションを見つけます。
  4. 拇印セクションを選択し、下のテキストをクリックします。
  5. Ctrl+Aを実行しCtrl+Cを選択してコピーします。

[詳細] タブを示す [証明書] ダイアログのスクリーンショット。拇印の値が強調表示されています。

Note

certutil コマンドは、常に成功するとは限りません。 これが失敗した場合は、証明機関 (CA) から秘密キーを含む証明書を取得する必要があります。

シナリオ 2

このシナリオでは、Web サイトにインストールされている秘密キーを含むサーバー証明書があることを検討してください。 ただし、 scenario 1 に示されているエラーが引き続き表示されます。 HTTPS 経由で Web サイトにアクセスすることはできません。

解決方法

  1. SSL Diagnostics ツールをダウンロードしてサーバーにインストールします。

  2. 秘密キーを含む証明書があり、Web サイトにまだアクセスできない場合は、このツールを実行するか、システム イベント ログで SChannel 関連の警告またはエラーを確認してください。

    SSLDiag ツールの実行中に、次のエラー メッセージが表示されることがあります。

    この証明書に対応する秘密キーがありますが、CryptAcquireCertificatePrivateKey が失敗しました。

    [SSL 診断] ウィンドウのスクリーンショット。エラー メッセージが強調表示されています。

    さらに、システム イベント ログに次の SChannel 警告が表示されます。

    Event Type: Error 
    Event Source: Schannel 
    Event Category: None 
    Event ID: 36870 
    Date: 2/11/2012 
    Time: 12:44:55 AM 
    User: N/A 
    Computer: 
    Description: A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x80090016. 
    

    このイベントまたはエラーは、証明書の秘密キーの取得に問題が発生したことを示します。 そのため、次の手順を試して警告を解決してください。

  3. まず、 MachineKeys フォルダーに対するアクセス許可を確認します。 すべての秘密キーは MachineKeys フォルダーに格納されるため、必要なアクセス許可があることを確認してください。

  4. アクセス許可が設定されていて、問題がまだ修正されていない場合は、証明書に問題がある可能性があります。 破損している可能性があります。 次の SChannel イベント ログに、0x8009001aのエラー コードが表示される場合があります。

    Event Type: Error 
    Event Source: Schannel 
    Event Category: None 
    Event ID: 36870 
    Date: 2/11/2012 
    Time: 12:44:55 AM 
    User: N/A 
    Computer: 
    A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x8009001a. 
    
  5. Web サイトがテスト証明書で動作するかどうかを確認します。

  6. 既存の証明書のバックアップを作成し、自己署名証明書に置き換えます。

  7. HTTPS を使用して Web サイトにアクセスしてみてください。 機能する場合は、以前に使用した証明書が破損しているため、新しい作業用証明書に置き換える必要があります。 場合によっては、問題が証明書ではなく発行者にある場合があります。 SSLDiag に次のエラーが表示される場合があります。

    [SSL 診断] ウィンドウのスクリーンショット。エラー メッセージが強調表示されています。

    CertVerifyCertificateChainPolicy は、ルート CA 証明書が信頼されたルートでない場合、 CERT_E_UNTRUSTEDROOT (0x800b0109)で失敗します。

  8. このエラーを解決するには、CA の証明書を、サーバー上の [マイ コンピューター アカウント] の [信頼されたルート CA] ストアに追加します。 次のエラーが表示される場合もあります。

    CertVerifyCertificateChainPolicy returned error -2146762480(0x800b0110). (CertVerifyCertificateChainPolicy がエラー -2146762480(0x800b0110) を返しました。)

  9. エラーを解決するには、次の手順を実行して、証明書の使用の種類を確認します。

    1. 証明書を開きます。
    2. 詳細タブを選択します。
    3. [プロパティの編集] を選びます。
    4. [ General ] タブで、[この証明書のすべての目的を 可能にする ] オプションが選択されていることを確認します。最も重要なのは、 Server Authentication が一覧に表示されます。

    [証明書のプロパティ] ダイアログの一部を示すスクリーンショット。この証明書のすべての目的を有効にする機能が選択されています。

シナリオ 3

最初の 2 つのシナリオは、証明書の整合性を確認するのに役立ちます。 証明書に問題がないことを確認すると、サイズの大きな問題が解決されます。 しかし、WEB サイトに HTTPS 経由でまだアクセスできない場合はどうでしょうか。 Web サイトの HTTPS バインドを確認し、リッスンしているポートと IP を決定します。

解決方法

  1. 次のコマンドを実行して、Web サイトで使用されている SSL ポートで他のプロセスがリッスンしていないことを確認します。

    netstat -ano" or "netstat -anob
    
  2. そのポートでリッスンしている別のプロセスがある場合は、そのプロセスがそのポートを使用している理由を確認します。

  3. IP ポートの組み合わせを変更して、Web サイトにアクセスできるかどうかを確認してみてください。

シナリオ 4

これで、Web サイトに適切な動作証明書がインストールされており、この Web サイトの SSL ポートを使用する他のプロセスがないことを確認できます。 ただし、HTTPS 経由で Web サイトにアクセスするときに、"ページを表示できません" というエラーが引き続き表示される場合があります。 クライアントが接続して SSL ネゴシエーションを開始すると、 HTTP.sys は、その SSL 構成で、クライアントが接続されている "IP:Port" ペアを検索します。 SSL ネゴシエーションが成功する前に、 HTTP.sys SSL 構成に証明書ハッシュと証明書ストアの名前を含める必要があります。 問題は HTTP.SYS SSL Listenerにある可能性があります。

HTTP.sysに登録されている証明書ハッシュは NULL であるか、無効な GUID を含む可能性があります。

解決方法

  1. 次のコマンドを実行します。

    IIS 6: "httpcfg.exe query ssl"
    IIS 7/7.5: "netsh http show ssl"
    

    Note

    HttpCfg は Windows サポート ツールの一部であり、インストール ディスクに存在します。

    動作中のシナリオと非稼働シナリオのサンプルを次に示します。

    作業シナリオ

    構成 設定
    IP 0.0.0.0:443
    ハッシュ c09b416d6b 8d615db22 64079d15638e96823d
    GUID {4dc3e181-e14b-4a21-b022-59fc669b0914}
    CertStoreName MY
    CertCheckMode 0
    RevocationFreshnessTime 0
    UrlRetrievalTimeout 0
    SslCtlIdentifier 0
    SslCtlStoreName 0
    Flags 0

    非稼働シナリオ

    構成 設定
    IP 0.0.0.0:443
    ハッシュ
    GUID {00000000-0000-0000-0000-000000000000}
    CertStoreName MY
    CertCheckMode 0
    RevocationFreshnessTime 0
    UrlRetrievalTimeout 0
    SslCtlIdentifier 0
    SslCtlStoreName 0
    Flags 0

    作業シナリオで見られるハッシュ値は SSL 証明書の拇印です。 GUID は、非稼働シナリオではすべて 0 であることに注意してください。 ハッシュに何らかの値があるか空白が含まれている場合があります。 Web サイトから証明書を削除し、 httpcfg query ssl実行した場合でも、Web サイトには GUID がすべて 0 として一覧表示されます。 GUID が "{0000...............000}" と表示される場合は、問題があります。

  2. 次のコマンドを実行して、このエントリを削除します。

    httpcfg delete ssl -i "IP:Port Number"
    

    例えば次が挙げられます。

    httpcfg delete ssl -i 0.0.0.0:443
    
  3. IP アドレスが一覧表示されているかどうかを確認するには、コマンド プロンプトを開き、次のコマンドを実行します。

    IIS 6: httpcfg query iplisten
    
    IIS 7/7.5: netsh http show iplisten
    

    IP リッスン リストが空の場合、コマンドは次の文字列を返します。

    HttpQueryServiceConfiguration completed with 1168.
    

    コマンドが IP アドレスのリストを返した場合は、次のコマンドを使用して、リスト内の各 IP アドレスを削除します。

    httpcfg delete iplisten -i x.x.x.x
    

    Note

    この後、 net stop http /y コマンドを使用して IIS を再起動します。

シナリオ 5

それでも HTTPS で Web サイトを参照できない場合は、クライアントまたはサーバーからネットワーク トレースをキャプチャします。 [SSL or TLS]\(SSL または TLS\) でトレースをフィルター処理して、SSL トラフィックを確認します。

動作しないシナリオのネットワーク トレース スナップショットを次に示します。

トレース スナップショットを示す [フィルターの表示] ウィンドウのスクリーンショット。

作業シナリオのネットワーク トレース スナップショットを次に示します。

成功したトレースのスナップショットを示す [フィルターの表示] ウィンドウのスクリーンショット。

これは、ネットワーク トレースを確認する方法です。 フレームの詳細を展開し、サーバーによって選択されたプロトコルと暗号を確認する必要があります。 説明から [Server Hello] を選択して、これらの詳細を表示します。

機能していないシナリオでは、クライアントは TLS 1.1 と TLS 1.2 のみを使用するように構成されていました。 しかし、Web サーバーは IIS 6 であり、TLS 1.0 までしかサポートできないため、ハンドシェイクは失敗しました。

レジストリ キーを調べて、有効または無効になっているプロトコルを確認します。 以下にパスを示します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

[Enabled] DWORD は [1] に設定する必要があります。 0 に設定されている場合、プロトコルは無効になります。

たとえば、SSL 2.0 は既定では無効になっています。

シナリオ 6

すべてが検証されており、HTTPS 経由で Web サイトへのアクセスに関する問題が引き続き発生している場合は、おそらく何らかの更新が行われ、SSL ハンドシェイクが失敗する原因となります。

Microsoft は、Windows での SSL の実装に対する更新プログラムをリリースしています。

MS12-006: Vulnerability in SSL/TLS could allow information disclosure: January 10, 2012

この更新プログラムは、Internet Explorer を使用するか、Internet Explorer を使用して HTTPS 要求を実行するアプリケーションを使用しているお客様に影響を与える可能性があります。

実際には、SSL 3.0/TLS 1.0 の情報漏えいの脆弱性に対処するために 2 つの変更が行われました。 MS12-006 更新プログラムは、 schannel.dllで新しい動作を実装します。これにより、クライアントがその動作を要求したときに、共通の SSL チェーンブロック暗号を使用しているときに追加のレコードが送信されます。 もう 1 つの変更は、Internet Explorer の 12 月の累積的な更新プログラム (MS11-099) の一部である Wininet.dllで、Internet Explorer が新しい動作を要求するようにしました。

問題が存在する場合は、サーバーに接続できない症状や要求が不完全になる症状で顕在化することがあります。 Internet Explorer 9 以降では、"Internet Explorer で Web ページを表示できません" というエラーが表示されます。 Internet Explorer の以前のバージョンでは、空白のページが表示されることがあります。

Fiddler は、HTTPS 要求をキャプチャしてサーバーに転送するときに、追加のレコードを使用しません。 そのため、Fiddler を使用して HTTPS トラフィックをキャプチャすると、要求は成功します。

レジストリ キー

MS12-006: SSL/TLS の脆弱性により、情報漏えいが発生する可能性があります:2012 年 1 月 10 日 SendExtraRecord レジストリ値があり、次のことができます。

  • 新しい SSL 動作をグローバルに無効にします。
  • グローバルに有効にする
  • (既定) 新しい動作を選択する SChannel クライアントに対して有効にします。

Internet Explorer および Internet Explorer コンポーネントを使用するクライアントの場合は、[FeatureControl] セクションにレジストリ キー FEATURE_SCH_SEND_AUX_RECORD_KB_2618444。これにより、 iexplore.exe またはその他の名前付きアプリケーションが新しい動作を選択するかどうかを決定します。 既定では、これは Internet Explorer で有効になり、他のアプリケーションでは無効になります。

詳細