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接続を切断するのですか?
ハンドシェイクの説明は、クライアントとサーバーがハンドシェイクを完全に実行したことを示しているようです。その後clientが接続を切断しました。これは、「何か」がクライアントの観点から正しくなかったことを意味します。主に2つの候補が考えられます。
サーバーから送信された証明書は「適切」ではありません。クライアントは、ユーザーの検証が必要であると判断しました。クライアントはハンドシェイクを完了したため、より速い「省略ハンドシェイク」でSSLセッションを再開できます(ネゴシエートされた「マスターシークレット」を再度非対称暗号化する必要なしに再利用します)が、リソースを開いたままにしないように接続を閉じました人間のユーザーが決心している間のサーバー(ミートバッグはslowです)。
サーバーから送信されたFinished
メッセージ(「暗号化されたハンドシェイクメッセージ」)には、(おそらくクライアントの)バグのため、(クライアントの観点から)不正な値が含まれています。これは非常に起こりそうなことではありません。
私の推測では、あなたは最初のケースにいると思います:サーバーはクライアントにとって「良くない」証明書チェーンを使用します。通常の犯人:
サーバーの証明書をクライアントマシンにservercert.crtなどのファイルにエクスポートします。クライアントで実行:certutil -verify -urlfetch servercert.crt
サーバー証明書チェーンが有効と見なされなかった理由がほぼ確実にわかります。よろしく