40

.NET/WCF アプリケーションとサード パーティの Web サーバーの間に双方向の SSL 通信チャネルをセットアップする必要があります。現在、すべての要素(クライアント証明書、サーバー認証局、ネットワーク通信など)が正しく設定されていることを確認するために、ホストとのハンドシェイクを成功させようとしています。s_client コマンドを使用して、openSSL コマンド ライン ツールを使用してこれを検証しようとしています。

これが私を止めているものであり、私が理解していないものです:

  • 私が何をしても、openSSLは クライアント証明書の秘密鍵を見つけることを期待しています
  • クライアント証明書はサードパーティから提供されたものですが、秘密鍵は含まれていません
  • openSSL を使用して独自の秘密鍵ファイルを生成すると、鍵の値の不一致エラーが発生します

私は SSL を使い始めたばかりなので、プロトコル全体について非常に基本的な理解を持っていることを覚えておいてください。私が読んだことから、サーバーとクライアントの両方が双方向SSL設定で秘密鍵を必要としているようです。ただし、クライアントで機能する秘密鍵を取得する方法がわかりません (提供されたクライアント証明書を使用して作業します)。これは私に大きな頭痛の種を与えているので、誰かがクライアント証明書の秘密鍵に光を当てることができれば非常に感謝しています.

4

3 に答える 3

71

証明書自体は公開された情報にすぎません。公開鍵証明書とそれに含まれる名前を結び付けるのは、その名前 (たとえば、あなたの名前またはサーバーの名前) を正当に制御できる人はだれでも、その秘密鍵も持っているという事実です。

証明書は、対応する秘密鍵でのみ実行できる操作をリモート パーティに実行するよう要求することにより、リモート パーティの ID を証明するために使用されます。たとえば、何かに署名する (公開鍵で検証できます)、または暗号化されたものを解読します。公開鍵。(暗号スイートによっては、両方とも SSL/TLS ハンドシェイクで発生する可能性があります。)

SSL/TLS ハンドシェイク中に、サーバーはその証明書を (平文で) 送信し、認証された鍵交換を使用して、対応する秘密鍵を持っていることをクライアントに証明します。

あなたの場合、クライアント証明書認証も使用したいと考えています。ハンドシェイク中にクライアント証明書を送信するだけでは十分ではありません。クライアントは秘密鍵を持っていることも証明する必要があります。そうしないと、その証明書を受け取った人は誰でもそれを複製できます。証明書を使用するポイントは、自分の秘密 (秘密鍵) を表示する必要がないように、複製を防止することです。

より具体的には、クライアントは、サーバーがクライアント証明書で送信された公開鍵に対して検証できるように、TLS ハンドシェイクのCertificate Verifyメッセージでハンドシェイク メッセージに署名する必要があります。この手順がないと、クライアント証明書認証は行われません。

クライアント証明書はサードパーティから提供されたものですが、秘密鍵は含まれていません

秘密鍵なしで証明書を提供することは、事前に証明書要求を生成することが期待されている場合を除き、少し無意味に思えます (その場合、秘密鍵を持っていることになります)。

確かに、証明書とその秘密鍵を与えられるよりも、鍵ペアを生成し、証明書要求 (CSR) を作成し、CA にその CSR から証明書を発行させる方が良い方法です (ただし、CA があなたの秘密鍵を知ることはありません)。秘密鍵)。この場合、秘密鍵を保持していることが期待され、受け取った証明書でそれを使用できます。

于 2012-06-26T00:29:46.733 に答える