Javaプログラムを通じてHTTPS URLを呼び出しています。このJavaクライアントは、この接続を確立するためにサーバーに証明書を提供する必要がありますか?言い換えれば、自分の証明書が必要ですか、それともサーバーの証明書(公開鍵が含まれています)で十分ですか?
何をしているか、何を確認したいかによって異なります。データにアクセスしていて、対応する秘密鍵を知っているサーバーがデータを送信するサーバーであることを確認したい場合(たとえば、Webページにアクセスしている場合)、独自の証明書は必要ありません。
サーバーがクライアントが事前定義されたものであることを確認できるようにしたい場合、有効なソースとして認識される公開鍵に対応する秘密鍵を知っている場合、クライアントには証明書が必要です。これは、サーバーのペアが通信しているときに使用される傾向があります。サーバーはそれぞれ独自の秘密鍵でデータに署名し、公開鍵と照合してデータが既知のソースからのものであることを確認できます。特定のクライアントのみがアクセスすることを目的とする一部のAPIでも使用できます。
したがって、一見すると、クライアント用の独自の証明書は必要ありません。証明書は、通常、サーバーによって十分に文書化されています。
一般に、HTTPSを実行しているほとんどのWebサーバーでは、クライアントが証明書を持っている必要はありません。サーバーがクライアントに認証を要求する場合、これは多くの場合、資格情報(ユーザー名とパスワードなど)を通じて行われます。
ただし、その逆は一般的には当てはまりません。つまり、ほとんどのクライアントは、認識されたCAによって署名された有効な証明書をWebサーバーに要求する必要があります。証明書が有効であることを確認するのはクライアントの責任です。そうでない場合、クライアントは、接続先のサーバーに実際に接続されていること、およびMITMされていないことを確認する方法がありません。
いいえ。私は試してみましたが、クライアントは証明書や事前定義されたキーを必要としません。
むしろ、サーバーから公開鍵(証明書の一部)を受け取った後、クライアントは「オンザフライ」で秘密を作り、サーバーの証明書の公開鍵でそれを暗号化します。クライアントは、ハンドシェイクの一部として暗号化されたシークレットをサーバーに送信します。サーバーだけが証明書で送信した公開鍵に対応する秘密鍵を持っている限り、サーバーだけがクライアントからの秘密を含むメッセージを復号化できます。クライアントとサーバーの両方が、安全に送信された秘密を使用して会話を続けます。
クライアントキーは、サーバーがクライアントのIDを確認する必要がある場合にのみ必要です。その場合、クライアントとサーバーは、代わりに互いの公開鍵で暗号化されたメッセージを送信することで通信できます。
次のjvmオプションを使用してコードを実行すると、この動作を確認できます。
Djavax.net.debug = ssl、handshake
クライアントとサーバーは、いくつかの異なる暗号システムについて合意し、それを使って交換された後、作成された秘密を使用します。私のテストベッドでは、デフォルトで楕円曲線暗号化になりました。
https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art06