web-dev-qa-db-ja.com

OpenSSLとs_client-クライアントから秘密鍵が必要なのはなぜですか?

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

ここに私を止めているものと私が理解していないものがあります:

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

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

ありがとう!

28
Aerendel

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

証明書は、対応する秘密鍵でのみ実行できる操作をリモートパーティに要求することにより、リモートパーティの身元を証明するために使用されます。公開鍵。 (暗号スイートによっては、どちらもSSL/TLSハンドシェイクで発生する可能性があります。)

SSL/TLSハンドシェイク中に、サーバーは証明書を(平文で)送信し、対応する秘密鍵があることをクライアントに証明します 認証済みの鍵交換を使用

あなたのケースでは、クライアント証明書認証も使用する必要があります。ハンドシェイク中にクライアント証明書を送信するだけでは不十分です。クライアントは、秘密鍵を持っていることも証明する必要があります。そうでなければ、その証明書を受け取った人は誰でもそれを複製することができます。証明書を使用する目的は、自分の秘密(秘密鍵)を見せなくて済むように、複製を防ぐことです。

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

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

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

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

50
Bruno