2011-10-31 22 views
4

私はAndroidデバイスからSSLを使用してHTTPを使用しているWebサービスを使用しています。自己署名(信頼できない)証明書はクライアント認証に使用されます。SSLと公開鍵のセキュリティ

私は、公開鍵/秘密鍵がSSLにどのように使用されているかを一般的に理解しています。私の理解から、証明書を使って安全な接続を確立し、安全にデータを送信する方法を明確に理解することができます。しかし、私は証明書が公開鍵を含んでおり、秘密にされていないので、クライアント認証にどのように使用されているのか分かりません。

私はいくつかの質問があります:

私はSSLと証明書がクライアント認証のために使用することができるかについて読むことができますか?

証明書が公開されていない場合でも、ブラウザのHTTPS URLを参照することで、証明書を表示して保存することができます。私はキーストアで証明書をパッケージ化し、アプリケーションから使用することができます。

this postでジェレミーHuiskampは、サーバがそれ

...ので、クライアント認証とデータの暗号化証明書を用いて行うことができる を要求したとき

クライアント認証が自動的に実行されます書き込み?

クライアントキーストアには、サーバーの公開キーだけでなく、クライアントの秘密キーも含める必要があります。サーバーは、クライアントの公開鍵を使用して解読できる必要がありますか?これは、キーストアに2つの証明書が必要であることを意味しますか?

答えて

8

まず、公開鍵暗号における用語についての迅速なポイント:あなたが

  • 署名した秘密鍵を使って解読/復号化、
  • は、あなたが(署名)を検証公開鍵を使用して暗号化/暗号化します。

(あなたは本当に公開鍵を使用して「解読」しません。)

またはクライアント認証なしでSSL/TLSを使用すると、サーバはそれがプライベートを持っている証明書(*)を提示しますキー。サーバーはSSL/TLSハンドシェイク(接続の開始時)で証明書を送信し、クライアントがプライベートキー(プライベートキーを使用)を使用して送信する内容を解読できます。秘密鍵と証明書は、サーバーのキーストア(またはそれがJavaで実装されていない場合は同等)に格納されます。

クライアントの一部として、truststoreが使用されます。これは、信頼できる証明書を含むキーストアであり、サーバー証明書を検証するためのフォームです。サーバー証明書は、明示的にトラストストアに格納するか、ほとんどの場合、トラストストア(PKI)の信頼できるCA証明書にリンクすることによって信頼されます。

Javaのキーストアとトラストストアの用語は少し混乱する可能性があります。詳細はdetails in this answerです。

質問には、クライアントのトラストストアにはサーバーの公開キーは含まれていませんが、証明書または検証可能なCA証明書が含まれています。 (公開鍵を持っているだけでなく、その証明書にある他の情報を使用していることを知っている)

これに加えてクライアント証明書認証を使用すると、トラストストア)、クライアント側のキーストアも必要になります。なぜなら、この目的のために役割が逆になっているからです。

クライアント認証を使用するSSL/TLSハンドシェイクでは、サーバーは、クライアントから証明書を要求します(使用可能な場合)。

このハンドシェイクの最後に、クライアントはCertificateVerifyメッセージを送信します。このメッセージは、クライアント証明書のプライベートキーを使用して、クライアントとサーバーの間でこれまでに交換されたすべてのメッセージに署名します。サーバは、この交換の一部として取得したクライアント証明書内の公開鍵に対してこの署名を検証することができます。これにより、クライアント側の誰でも、送信した証明書の公開鍵に対応する秘密鍵があることがサーバーに証明されます。

サーバの次のステップは、この証明書を信頼するかどうか、つまり、証明書内に提示され、「封印された」IDと公開鍵の間のバインディングを信頼するかどうかを検証することです。 通常、PKIを使用して証明書を既知のCAと照合するか、展開環境が十分に小さい場合は、固定セットの信頼できる証明書と照合して行われます。 (そこalternative methods of verificationすることができますが、その使いやすさは本当にあなたがこのシステムを導入したい状況に依存します。)

したがって、あなたの2番目の質問のために:

  • ストアが少なくとも含まれている必要があり、クライアントクライアントの証明書と秘密鍵。
  • クライアントtruststoreには、サーバー証明書またはサーバー証明書を検証できるCA証明書が含まれている必要があります。
  • 両方ストアので

と異なる目的のために使用される(記憶形式意味で、通常のファイル)キーストアがトラストされ、それは、キーストアとトラストの目的の両方を提供するために同じキーストアを使用することがしばしば可能です。

(*)証明書に依存しない暗号スイートがありますが、これはこの質問では珍しい話題です。

2

証明書は、IDを公開鍵にバインドするだけです。このバインドは秘密ではないため、証明書を秘密にする必要はありません。ジョン・スミスの証明書があれば、ジョン・スミスが特定の公開鍵に対応する秘密鍵を所有していることを証明できます。しかし、私はその秘密鍵を知らないので、証明書は私には役に立たない。

証明書で認証が行われる場合、証明書を提示する人に証明書の公開鍵に対応する秘密鍵がわかっていることを証明することが常に必要です。そのステップを通過できない場合、認証は失敗します。

サーバーのキーストアにはサーバーの証明書が必要です。クライアントのキーストアにはクライアントの証明書が必要です。クライアントはその証明書をサーバに提示するので、サーバはクライアントの公開鍵をそのように習得します。 (およびその逆。)

関連する問題