web-dev-qa-db-ja.com

相互認証と機密保持のためのシステム

クライアントとサーバー間の相互認証が必要なプロトコルを探しています。たとえば、サーバーは特定のクライアントにのみ接続する必要があります。つまり、クライアントはクライアントを認証し、クライアントはサーバーと通信する必要があります。また、この後、すべての通信が暗号化されます。

SSL/TLSがこれを提供できるかどうか。または、クライアントがサーバーに自分自身を認証するためのパスワードを与えることができる方法があります。

私の主な要件は、サーバーが特定のクライアントにのみ情報を提供することです。

5
user2315

SSL/TLS内で相互認証を行う方法は2つあります。

  • 証明書を使用します。サーバーは、通常のように、証明書内で彼の公開鍵を提示します。クライアントは、クライアントが事前に知っているいくつかのroot CAに関してサーバー証明書を検証します(この部分はHTTPS Webサイトで一般的に発生するものです)。次に、サーバーはclient証明書を要求できます。この場合、クライアントは証明書を送信して署名を実行する必要があり、サーバーはこれを使用して検証します。クライアント証明書のキー。その後、クライアントは、この証明書に記述されている「名前」の下で認証されます。これは TLS標準 のセクション7.4.6および7.4.8で説明されています。

  • [〜#〜] srp [〜#〜] を使用します。これは Password Authenticated Key Exchange プロトコルであり、クライアントとサーバーは共有シークレットの知識を通じて相互に認証します。一般にPAKE(特にSRP)について非常に優れている点は、共有シークレットが低エントロピー(たとえば、これは「パスワード」)であっても、スキームが強力であることです。これは、オフライン辞書攻撃:簡単に言うと、プロトコルは、攻撃者が潜在的なパスワードを「試行」したい場合、サーバーまたはクライアントと何らかの方法でやり取りする必要があるようなものです方法、そしてすべての試みのためにそうする必要があります。攻撃者は自分のマシンでのみパスワードをチェックするのに十分な情報を取得することはありません。

SRPは、証明書のあいまいなビジネスをすべて回避します。残念ながら、SRPはまだ広くサポートされていません。 GnuTLS は、SSL/TLSサーバーとクライアントを実装し、SRPをサポートするオープンソースライブラリです。

6
Tom Leek

SSL/TLSはこれを提供し、おそらく相互認証を機能させる最も簡単な方法でしょう。これは、クライアント証明書を使用して行われます。ただし、サーバーとブラウザーのソフトウェアがわからないため、セットアップの正しい方向を示すことはできませんでした。私は この情報 を見つけましたが、これはApacheについて説明しています。

3
mikeazo