web-dev-qa-db-ja.com

SSLには、あらゆる種類のクライアント側証明書が必要ですか?

友人は、ブラウザとサーバーの両方に証明書が必要であると主張しています。いいえ、サーバーだけが2つのキーを持つ1つを必要とします。問題は、ブラウザがサーバーとのSSL/TLS通信での暗号化に何らかの証明書(キーだけでなく)を使用するかどうかです。

6
ProfK

あなたの友達は正しいです。ブラウザには、ルート証明機関の証明書が必要です。これにより、サーバー証明書が正当な証明機関によって署名されていることを確認できます。

6
Mike Scott

信頼できる当事者によって発行された証明書の典型的なケース(Let's Encryptなど)

クライアントは中間者攻撃を検出するために予想されるサーバーと通信することを確認する必要があるため、サーバー証明書は不可欠です。クライアントに対して自分自身を認証するには、サーバーはこのために公開されている証明書自体と、サーバーのみが知っている証明書に一致する秘密キーが必要です。サーバーが提供する証明書を信頼できるものとして受け入れるために、クライアントは、とりわけ、この証明書が信頼できる当事者、つまり信頼できるCA(CAは認証局、つまり証明書を発行するエンティティ)によって発行されたかどうかをチェックします。これらの信頼できるCAは、クライアントのオペレーティングシステムまたはブラウザの信頼ストアに証明書として保存されます。これらは、クライアント側で必要な種類の証明書です。

そして、サーバーに対してクライアントを認証するために使用されるクライアント証明書があります。これらはオプションであり、まれにしか使用されません。これらが使用される場合、クライアントは(公開)証明書自体だけでなく、サーバーがクライアントに対して自分自身を認証するために必要なものと同様に、一致する秘密秘密鍵も必要とします。

自己署名サーバー証明書のまれなケース

この場合、サーバーは、ブラウザー(またはアプリまたは他のクライアント)が認識しているCAによって発行されていない証明書を送信します。この場合、クライアント側で証明書は関係しませんが、クライアントは、証明書が期待されるものであるかどうかを確認する別の方法を見つける必要があります。通常、この場合、ブラウザは例外を追加するようユーザーに要求します。

証明書がまったくないというさらにまれなケース

SSL/TLSは、証明書なしで、つまりサーバー側でも使用することもできます。この場合、認証はクライアントとサーバー間で事前共有された秘密鍵(PSK)などの他の方法で行われます。これらのメソッドはめったに使用されず、ブラウザはこれらをサポートしません。

12
Steffen Ullrich

SSLを使用してサーバーとクライアントの間で何が起こるかを見てみましょう。 From Wikipedia

[T]ハンドシェイク手順を使用してステートフル接続をネゴシエートします。 [...]このハンドシェイク中に、クライアントとサーバーは、接続のセキュリティを確立するために使用されるさまざまなパラメーターに同意します。

  • クライアントがセキュア接続を要求するTLS対応サーバーに接続し、クライアントがサポートされている暗号スイート(暗号およびハッシュ関数)のリストを提示すると、ハンドシェイクが開始されます。
  • サーバーは、このリストから暗号化とハッシュ関数を選択し、それもサポートしてクライアントに決定を通知します。
  • サーバーは通常、デジタル証明書の形式で識別情報を送り返します。証明書には、サーバー名、証明書の信頼性を保証する信頼できる認証局(CA)、およびサーバーの公開暗号化キーが含まれています。
  • クライアントは、続行する前に証明書の有効性を確認します。
  • セキュア接続に使用されるセッションキーを生成するには、クライアントは次のいずれかを実行します。
    • サーバーの公開鍵で乱数を暗号化し、結果をサーバーに送信します(サーバーのみがその秘密鍵で復号化できるはずです)。その後、両当事者は、乱数を使用して、セッション中の後続のデータの暗号化および復号化のための一意のセッションキーを生成します
    • diffie-Hellman鍵交換を使用して、暗号化および復号化のためのランダムかつユニークなセッションキーを安全に生成します。これには、前方秘匿性という追加の特性があります。セッションは第三者によって傍受および記録されます。

これにより、ハンドシェイクが終了し、接続が閉じるまでセッションキーで暗号化および復号化されるセキュリティで保護された接続が開始されます。

serverはクライアントに証明書を要求しません。通常、ステップ4(証明書の有効性の確認)では、クライアントはCA証明書のローカルストアを使用して、サーバーから提示された証明書チェーンが有効であることを確認します。ただし、クライアントが他の方法を使用することは完全に可能です。たとえば、これは自己署名証明書で発生することです。検証できないこの証明書を受け入れるかどうかをブラウザが尋ね、確認すると、喜んでハンドシェイクを完了します。 curlwgetなどのコマンドラインクライアントには、証明書チェーンを検証しないことを示すオプションがあります。

クライアントは証明書を持っている必要はありませんが、サーバーが誰であるかを確認することをお勧めします。つまり、クライアントはサーバーが提示する証明書チェーンを確認するためにCA証明書を必要とします。

クライアント認証証明書を要求するようにサーバーを構成することが可能です。 このMSDN投稿 を参照してください。

1
muru

TLSは、「TLS」証明書(実際にはX.509証明書)なしでも機能します。これは直交です。 1つのエンドポイントに証明書、またはその両方を含めることも、まったく持たないこともできます。 TLSにはさまざまな利点がありますが、認証はそのうちの1つにすぎません(実際、最も重要なのは機密性よりも直感に反することが多いためです)

0
Patrick Mevzek