web-dev-qa-db-ja.com

双方向HTTPSでの「クライアント証明書」関連エラーのトラブルシューティング方法

相互認証用のクライアント証明書を要求するWebサーバーがあります。適切な証明書がクライアントブラウザにロードされていると思います。ただし、ブラウザが証明書を見つけることができず、IEからページにアクセスすると、「このページは表示できません」というエラーが表示されます(クロムとFFでも失敗します)。サーバーがクライアントブラウザに要求している証明書を正確に把握するのに役立つツールはありますか?

一部のネットワークモニターを試してみましたが、交換できない多くのデータがあり、検出できません。

3
user93353
  • サーバーが最初のハンドシェイク中に証明書を要求する場合は、Wiresharkを使用して、Certificate Request TLSメッセージ(Server Hello Doneの直前)を探します。このパッケージの詳細を調べると、受け入れ可能なCAのリストを示すcertificate_authoritiesリストが表示されます。ローカルチェーンは、これらのいずれかに一致する必要があります。

  • 表示されるCertificate Requestメッセージがない場合は、再ネゴシエートされたハンドシェイクにある可能性があります。この場合、この2番目のハンドシェイクは暗号化されるため、すぐには表示されません。 Wiresharkの最近のバージョンでは、プレマスターシークレットを使用できます( "を参照してください)Wiresharkの(Pre)-Master-Secretセクションの使用SSL wikiページ 、そして この答え もちろんです)これは一般により複雑ですが、これは可能です。

    より一般的には、問題をデバッグするために、Firefoxを使用するときに、SSLDEBUG(およびSSLDEBUGFILE)などの他の NSS環境変数 も確認します。

さらに、openssl s_client -connect my.Host.example:443 -servername my.Host.exampleを使用して(必要に応じてさまざまな詳細レベルで)、サーバーへのブラウザー接続をシミュレートできます。これにより、少なくともCertificate RequestメッセージでアドバタイズされるCAがわかります。サーバーが再ネゴシエーションを使用する場合、多かれ少なかれこのように見える(必要なものに適応した)最小限のHTTPリクエストを書く必要があるかもしれません:

GET /my/protected/resource HTTP/1.1
Host: my.Host.example

(一部の複雑な設定では、ブラウザのリクエストから表示される他のヘッダーを、開発者ツールを使用してコピー/貼り付けする必要がある場合があります。)

-prexitオプションも便利な場合があります this answer にクレジットしてください。)

コメントから、手動でのHTTPリクエストの偽造は機能しないようですので、curl --verbose https://my.Host.example/my/protected/resource > /dev/nullを使用することもできます(--trace--trace-asciiなどのデバッグレベルを使用することもできます。必須、curlのmanページを参照)。これはこのようなものを生成するはずなので、うまくいけばどこかにCertificate Requestが表示されるはずです:

* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server key exchange (12):
{ [data not shown]

より現実的なリクエストが必要な場合は、開発者ツールを開いた後でChrome=から実際のリクエストを作成します。それを右クリックして[cURLとしてコピー]を使用し、貼り付けて、 curlで使用します(--verboseまたはその他を追加):これにより、必要なヘッダーがコピーされます。例のビデオ here があります。

3
Bruno

最近このような問題に直面しました。より新しいバージョンのFirefoxを使用している場合の症状はPR_END_OF_FILE_ERROR私が疑い、最終的に見つけたのは、デスクトップ上のインターネット保護ソフトウェアでした。

特定のものはMcAfee Online Threat Preventionでした。私の疑いは、元のリクエストを何らかの方法でインターセプトして再作成しましたが、相互認証との互換性がないため、セッションが終了します。

これが原因で、AiProtectionまたはAsusルーター上のTrend Microが有効になっている場合に何かが同じ問題を引き起こす可能性があると思います。マカフィーやインターネット保護ソフトウェアがインストールされていない場合は、注意が必要です。

0

これは「説明に基づく最も可能性の高い問題」なので、「トラブルシューティングの方法」ではありませんが、秘密鍵とクライアント証明書をインストールしましたか?

ブラウザーのキーストア(WindowsではIEまたはChrom [e | ium]の場合、Windowsキーストアです)で、両方のクライアント証明書および対応する秘密鍵がインストールされます。

証明書マネージャーのGUIで証明書を確認する場合([検索の開始]を使用するか、certmgr.msc;おそらく「システム証明書」ではなく「ユーザー証明書」ストアが必要です)、証明書アイコンの左上に小さな鍵のアイコンがあるはずです(証明書アイコン自体が長方形で、右下に小さなリボンがあります)。証明書を開くと、[全般]タブの下部に小さな鍵のアイコンが表示され、「この証明書に対応する秘密鍵があります」と表示されます。

Screenshots of Windows' Certificate properties view, on the General and Details tabs, of a TLS client certificate. Left screenshot (General tab) shows the "Proves your identity to a remote computer" and "You have a private key that corresponds to this certificate" text. Right screenshot (Details tab) shows the Enhanced Key Usage property, which includes "Client Authentication (1.3.5.1.5.5.7.3.2)"

そうでない場合、証明書はクライアント証明書として使用できません。サーバーが証明書をブラウザーに提示するときにサーバーが証明書の秘密キーを必要とするのと同様に、ブラウザーがサーバーに提示するときにブラウザーは証明書の秘密キーを必要とします。秘密鍵がないと、ブラウザーは証明書をTLS相互認証のオプションとして表示しません。

この問題を修正するには、証明書の作成に使用した秘密鍵を見つけて、コンピューターにインストールします。 .PFXまたは.P12(または同様の)ファイルの証明書とバンドルされる可能性があります。証明書が別のマシンからエクスポートされた場合は、秘密鍵とともにエクスポートされたことを確認してください(デフォルトでは、Windowsは秘密鍵をエクスポートしません)。秘密鍵を取得できない場合-それが失われた場合、またはそのパスフレーズが失われた場合、またはエクスポート不可とマークされている場合(そして、とにかくかなりハッキーな手順を実行してエクスポートしない場合)は、それが存在する場合-新しいキーを使用して新しい証明書署名リクエストを作成し、証明書を再度発行する必要があります。


ブラウザーが証明書を信頼または提示しない可能性があるその他の考えられる理由:

  • 有効期間外です(有効期限が切れているか、まだ有効ではありません)。
    • 確認するには、[有効期限]ボックスを確認し、証明書の[情報]ボックスも確認します(「この証明書の有効期限が切れているか、まだ有効ではありません」と表示されます)。スクリーンショットの証明書の有効期限は切れていますが、画像がキャプチャされました。
    • 修正するには:(まだ有効でない場合)有効になるまで待つか、証明書を再発行します。
  • クライアントの識別に使用できるものとしてマークされていません。
    • 確認するには:証明書の情報ボックスで、「リモートコンピューターにIDを証明する」(スクリーンショットの左側にある青いボックスを参照)と表示され、[詳細]タブの[拡張キーの使用法]で、「クライアント認証」と、OIDと呼ばれる長い一連のドットと数字を組み合わせたものです。
    • 修正するには:適切なOIDで証明書を再発行します。
  • その署名は無効です。証明書は発行後に改ざんされることなく改ざんされました。
    • 確認するには:Windowsは、証明書の署名が無効であることを通知します。おそらく、[証明書情報]ボックス([全般]タブ)と[証明書ステータス]ボックス([証明書パス]タブ)の両方にあります。
    • 修正するには:CAによって発行された元の証明書ファイル(または、自己署名証明書の場合は元々自己署名された証明書)に戻るか、再発行します。
  • 証明書の署名を検証できません。これは、コンピュータに公開鍵がインストールされていないCA(認証局)によって証明書が発行された場合に発生します。
    • 確認するには:[証明書情報]ボックスに「Windowsは証明書の署名を確認できません」などと表示され、[証明のパス]タブで、Windowsが探しているが見つからないチェーン内の証明書を確認します。
    • 修正するには:CAの証明書をダウンロードしてインストールします(CAの秘密鍵は不要であり、おそらくアクセスするべきではありません)。 WindowsがCAを自動的に認識しない場合、HTTPSサーバーも認識しない可能性が高いことに注意してください。
  • 証明書チェーンの一部の証明書が取り消されているか、期限切れであるか、またはその他の方法で無効です。
    • チェックするには:証明書の情報ボックスには、「Windowsはこの証明書の信頼性を確認できません」などと表示されます。証明書パスを見て、チェーン内のどの証明書が無効かを確認します。アイコンの隅に小さな赤(X)が表示されます。
    • 修正するには:CAの新しい証明書または正しい証明書をダウンロードしてインストールします。公開鍵が変更された場合は、古い鍵を使用して発行された証明書も置き換える必要があります。つまり、証明書を再発行する必要があります。

お役に立てば幸いです。

0
CBHacking