web-dev-qa-db-ja.com

SSLハンドシェイクに失敗しました

C++(IDE:Qt Creator)を使用して作成されたWindowsデスクトップアプリケーションで作業しています。ログインパネルがあり、openssl 1.0ライブラリを使用してhttps接続経由でユーザー検証を行います。ほとんどのマシンでアプリケーションが機能していますが、いくつかのマシンからhttps接続を行っているときに「SSLハンドシェイクに失敗しました」エラーが発生します。

私はwiresharkを使用してエラーをデバッグしてみました。私の観察は次のとおりです:

1)クライアントが[SYN]をサーバーに送信します。
2)サーバーは[SYN、ACK]をクライアントに送信します。
3)クライアントは[ACK]をサーバーに送信します。
4)クライアントは「Client Hello」というメッセージをサーバーに送信します。
5)サーバーは、「Server Hello、Certificate、Server Hello Done」というメッセージとともに公開鍵を送信します
6)クライアントは、「クライアントキー交換、暗号仕様の変更、暗号化されたハンドシェイクメッセージ」というメッセージとともに公開鍵を送信します
7)サーバーはメッセージ「暗号仕様の変更、暗号化されたハンドシェイクメッセージ」とともに暗号化されたハンドシェイクメッセージを送信します
8)クライアントが[FIN、ACK]を送信します
9)サーバーが[FIN、ACK]を送信します
10)クライアントが[FIN]を送信します

7番目のステップでは、クライアントがサーバーから暗号化されたメッセージを受信するとすぐに、クライアントはFIN信号によってハンドシェイクの終了を開始します。どんな考えでも、クライアントが両方のキーを交換した後、なぜ「SSLハンドシェイクの失敗」でssl接続を切断するのですか?

5
ram

ハンドシェイクの説明は、クライアントとサーバーがハンドシェイクを完全に実行したことを示しているようです。その後clientが接続を切断しました。これは、「何か」がクライアントの観点から正しくなかったことを意味します。主に2つの候補が考えられます。

  1. サーバーから送信された証明書は「適切」ではありません。クライアントは、ユーザーの検証が必要であると判断しました。クライアントはハンドシェイクを完了したため、より速い「省略ハンドシェイク」でSSLセッションを再開できます(ネゴシエートされた「マスターシークレット」を再度非対称暗号化する必要なしに再利用します)が、リソースを開いたままにしないように接続を閉じました人間のユーザーが決心している間のサーバー(ミートバッグはslowです)。

  2. サーバーから送信されたFinishedメッセージ(「暗号化されたハンドシェイクメッセージ」)には、(おそらくクライアントの)バグのため、(クライアントの観点から)不正な値が含まれています。これは非常に起こりそうなことではありません。

私の推測では、あなたは最初のケースにいると思います:サーバーはクライアントにとって「良くない」証明書チェーンを使用します。通常の犯人:

  • サーバー証明書チェーンは、クライアントの「信頼されたルート」の1つにリンクしません(クライアントで使用されるライブラリによっては、ルートのリストが複数の場所に存在する場合があります)。
  • サーバーnameは、クライアント(URL内の1つ)が予期するとおり、サーバーの証明書の名前と照合されません。
  • クライアントのクロックが大幅にずれているため、クライアントの観点から見ると、「将来的に」発行されるか、期限が切れている証明書は拒否されます。
7
Tom Leek

サーバーの証明書をクライアントマシンにservercert.crtなどのファイルにエクスポートします。クライアントで実行:certutil -verify -urlfetch servercert.crt

サーバー証明書チェーンが有効と見なされなかった理由がほぼ確実にわかります。よろしく

4
lsousa