モジュール java.base
パッケージ javax.net.ssl

クラスSSLSocket

java.lang.Object
java.net.Socket
javax.net.ssl.SSLSocket
すべての実装されたインタフェース:
Closeable, AutoCloseable

public abstract class SSLSocket extends Socket
このクラスはSocketを拡張し、"セキュア・ソケット・レイヤー" (SSL)やIETF "トランスポート層のセキュリティ" (TLS)プロトコルのようなプロトコルを使って安全なソケットを提供します。

これらのソケットは、通常のストリーム・ソケットですが、TCPなどのベースとなるネットワーク・トランスポート・プロトコル上にセキュリティ保護層を追加します。 次のセキュリティ保護が行われます。

  • 整合性の保護 SSLがメッセージを盗聴による改ざんから保護する。
  • 認証 ほとんどのモードでは、SSLによりピア認証が提供される。 通常は、サーバー認証が行われる。サーバーからの要求に応じて、クライアント認証も行われる。
  • 機密性(プライバシの保護) ほとんどのSSLモードでは、クライアントとサーバー間で送信されるデータが暗号化され、データの機密性が保護される。 この結果、受動的な盗聴によって、金融情報や個人情報などの機密性の高いデータが盗聴されることがない。

これらのセキュリティ保護は、「暗号化方式群」を使用して指定します。暗号化方式群は、指定されたSSL接続で使用される暗号化アルゴリズムの組合せです。 ネゴシエーション処理時には、2つの終端が同じ暗号化方式群を選択し、その暗号化方式群が両方の環境で使用可能である必要があります。 共通の暗号化方式群がない場合は、SSL接続を確立できず、データを交換できません。

使用される暗号化方式群は、「ハンドシェーク」と呼ばれるネゴシエーション・プロセスによって確立されます。 ハンドシェークでは、セッションの作成またはセッションへの参加が行われます。このセッションは、時間の経過とともにさまざまな接続を保護します。 ハンドシェークが完了すると、getSessionメソッドを使用してセッション属性にアクセスできます。 この接続の最初のハンドシェークは、次の3つのうちいずれかの方法で開始できます。

  • startHandshakeを呼び出し、ハンドシェークを明示的に開始する。
  • このソケットに対してアプリケーション・データの読み込みまたは書込みを行うと、ハンドシェークが暗黙的に開始される。
  • getSessionを呼び出すと、有効なセッションが現在存在しない場合はセッションが設定され、ハンドシェークが暗黙的に開始される。

なんらかの理由でハンドシェークが失敗した場合、SSLSocketが閉じ、通信できなくなります。

暗号化方式群を使用するときは、2つのグループについて理解する必要があります。

  • サポートされる暗号化方式群: SSL実装でサポートされるすべての暗号化方式群。 このリストは、getSupportedCipherSuitesを使用して報告される。
  • 有効になっている暗号化方式群。サポートされる暗号化方式群の完全なセットより少ないことがある。 このグループは、setEnabledCipherSuitesメソッドを使用して設定し、getEnabledCipherSuitesメソッドを使用して照会する。 新しいソケットでは、最小限の推奨構成を表すデフォルトの暗号化方式群が、初期状態で使用可能になっている。

デフォルトの実装で使用可能にする暗号化方式群では、サーバーを認証し、機密性が保証されなければいけません。 サーバー認証が行われず機密性が保証されない暗号化方式群を選択する場合は、サーバー認証が行われず非公開性が保証されない(暗号化されない)通信が使用されることに2つの終端が明示的に同意する必要があります。

SSLSocketが最初に作成されるとき、ハンドシェイクは行われないので、アプリケーションは最初に通信プリファレンスを設定することができます: どの暗号スイートを使用するか、ソケットをクライアント・モードにするべきか、サーバー・モードにするべきかなどです。しかし、セキュリティは常に、アプリケーション・データが接続を介して送信されるまでに提供されます。

ハンドシェークの完了を伝えるイベント通知を受信するように設定できます。 この場合、2つの追加クラスを利用する必要があります。 HandshakeCompletedEventオブジェクトは、このAPIのユーザーによって登録されたHandshakeCompletedListenerインスタンスに渡されます。 SSLSocketは、SSLSocketFactoryによって、またはSSLServerSocketからの接続をacceptによって作成されます。

SSLソケットの動作には、クライアント・モードまたはサーバー・モードがあります。 ハンドシェーク・プロセスを開始するピア、および各ピアから送信されるメッセージは、モードによって決まります。 接続には、クライアントとサーバーが1つずつ必要です。この要件を満たしていない場合、ハンドシェークは正しく行われません。 最初のハンドシェークが開始されてからは、ネゴシエーションをやり直す場合であっても、ソケットはクライアント・モードとサーバー・モードを切り替えられません。

このクラスのメソッドによって返されるApplicationProtocol String値は、ピアによって送信されるネットワーク・バイト表現内にあります。 バイトは直接比較することも、比較のためにUnicode {code String} 形式に変換することもできます。

     String networkString = sslSocket.getHandshakeApplicationProtocol();
     byte[] bytes = networkString.getBytes(StandardCharsets.ISO_8859_1);

     //
     // Match using bytes:
     //
     //   "http/1.1"                       (7-bit ASCII values same in UTF-8)
     //   MEETEI MAYEK LETTERS "HUK UN I"  (Unicode 0xabcd->0xabcf)
     //
     String HTTP1_1 = "http/1.1";
     byte[] HTTP1_1_BYTES = HTTP1_1.getBytes(StandardCharsets.UTF_8);

     byte[] HUK_UN_I_BYTES = new byte[] {
         (byte) 0xab, (byte) 0xcd,
         (byte) 0xab, (byte) 0xce,
         (byte) 0xab, (byte) 0xcf};

     if ((Arrays.compare(bytes, HTTP1_1_BYTES) == 0 )
             || Arrays.compare(bytes, HUK_UN_I_BYTES) == 0) {
        ...
     }

     //
     // Alternatively match using string.equals() if we know the ALPN value
     // was encoded from a String using a certain character set,
     // for example UTF-8.  The ALPN value must first be properly
     // decoded to a Unicode String before use.
     //
     String unicodeString = new String(bytes, StandardCharsets.UTF_8);
     if (unicodeString.equals(HTTP1_1)
             || unicodeString.equals("\uabcd\uabce\uabcf")) {
         ...
     }
 

APIのノート:
接続が不要になった場合、クライアント・アプリケーションとサーバー・アプリケーションは、それぞれの接続の両側を閉じる必要があります。 たとえば、SSLSocketオブジェクトの場合、アプリケーションでSocket.shutdownOutput()OutputStream.close()をコールして出力ストリームを閉じ、Socket.shutdownInput()InputStream.close()をコールして入力ストリームをクローズできます。 入力ストリームのクローズは、最初にクローズされるピア出力ストリームに依存する場合があります。 適切な方法で(たとえば、ピアの書込み閉包通知を受信する前にSocket.shutdownInput()がコールされるとします。)に接続がクローズされない場合、エラーが発生したことを示す例外が発生する可能性があります。 SSLSocketが閉じられると、再利用できなくなります: 新しいSSLSocketを作成する必要があります。
導入されたバージョン:
1.4
関連項目:
  • コンストラクタの詳細

    • SSLSocket

      protected SSLSocket()
      サブクラスでだけ使用されます。 初期化されていない未接続のTCPソケットを作成します。
    • SSLSocket

      protected SSLSocket(String host, int port) throws IOException, UnknownHostException
      サブクラスでだけ使用されます。 指定されたポートの指名されたホストに対するTCP接続を作成します。 このソケットは、SSLクライアントとして動作します。

      セキュリティ・マネージャが存在する場合、そのcheckConnectメソッドが、ホスト・アドレスとportを引数に指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      パラメータ:
      host - 接続先のホストの名前、またはループバック・アドレスの場合はnull
      port - サーバーのポートの番数
      例外:
      IOException - ソケットの作成時に入出力エラーが発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckConnectメソッドでこの操作が許可されていない場合。
      UnknownHostException - ホストが不明である場合
      IllegalArgumentException - portパラメータが指定された有効なポート値の範囲(0から65535)外である場合。
      関連項目:
    • SSLSocket

      protected SSLSocket(InetAddress address, int port) throws IOException
      サブクラスでだけ使用されます。 指定されたアドレスとポートのサーバーに対するTCP接続を作成します。 このソケットは、SSLクライアントとして動作します。

      セキュリティ・マネージャが存在する場合、そのcheckConnectメソッドが、ホスト・アドレスとportを引数に指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      パラメータ:
      address - サーバーのホスト
      port - ポート
      例外:
      IOException - ソケットの作成時に入出力エラーが発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckConnectメソッドでこの操作が許可されていない場合。
      IllegalArgumentException - portパラメータが指定された有効なポート値の範囲(0から65535)外である場合。
      NullPointerException - addressがnullである場合。
      関連項目:
    • SSLSocket

      protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
      サブクラスでだけ使用されます。 指定されたポートの指名されたホストに対するSSL接続を作成します。接続のクライアント側は、指定されたアドレスとポートにバインドされます。 このソケットは、SSLクライアントとして動作します。

      セキュリティ・マネージャが存在する場合、そのcheckConnectメソッドが、ホスト・アドレスとportを引数に指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      パラメータ:
      host - 接続先のホストの名前、またはループバック・アドレスの場合はnull
      port - サーバーのポートの番数
      clientAddress - ソケットのバインド先のクライアントのアドレス、またはanyLocalアドレスの場合はnull
      clientPort - ソケットのバインド先のクライアントのポート、またはシステムで選択された空いているポートの場合はzero
      例外:
      IOException - ソケットの作成時に入出力エラーが発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckConnectメソッドでこの操作が許可されていない場合。
      UnknownHostException - ホストが不明である場合
      IllegalArgumentException - portパラメータまたはclientPortパラメータが指定された有効なポート値の範囲(0から65535まで)にない場合。
      関連項目:
    • SSLSocket

      protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
      サブクラスでだけ使用されます。 指定されたアドレスとTCPポートのサーバーに対するSSL接続を作成します。接続のクライアント側は、指定されたアドレスとポートにバインドされます。 このソケットは、SSLクライアントとして動作します。

      セキュリティ・マネージャが存在する場合、そのcheckConnectメソッドが、ホスト・アドレスとportを引数に指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      パラメータ:
      address - サーバーのホスト
      port - ポート
      clientAddress - ソケットのバインド先のクライアントのアドレス、またはanyLocalアドレスの場合はnull
      clientPort - ソケットのバインド先のクライアントのポート、またはシステムで選択された空いているポートの場合はzero
      例外:
      IOException - ソケットの作成時に入出力エラーが発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckConnectメソッドでこの操作が許可されていない場合。
      IllegalArgumentException - portパラメータまたはclientPortパラメータが指定された有効なポート値の範囲(0から65535まで)にない場合。
      NullPointerException - addressがnullである場合。
      関連項目:
  • メソッドの詳細

    • getSupportedCipherSuites

      public abstract String[] getSupportedCipherSuites()
      この接続で使用可能にできる暗号化方式群の名前を返します。 通常は、その一部のみがデフォルトで使用可能になります。デフォルトのサービス品質要件を満たしていない暗号化方式群は、使用不可になります。 これらの暗号化方式群は、特殊なアプリケーションで使用されます。

      返される配列には、Java Cryptography Architecture標準アルゴリズム名ドキュメントの「JSSE暗号スイート名」セクションの標準暗号スイート名のリストからの暗号スイートが含まれ、プロバイダがサポートする他の暗号スイートも含まれます。

      戻り値:
      暗号化方式群名の配列
      関連項目:
    • getEnabledCipherSuites

      public abstract String[] getEnabledCipherSuites()
      この接続で現在使用可能になっているSSL暗号化方式群の名前を返します。 SSLソケットが最初に作成されたときに、使用可能になっているすべての暗号化方式群で、最小限のサービス品質が保証されます。 環境によっては、この値は空の場合もあります。

      スイートが有効になっている場合でも、スイートは使用できないことに注意してください。 これは、ピアがサポートしていないか、またはその使用が制限されているか、スイートの必須の証明書(秘密キー)が利用できない場合、または匿名スイートが有効であるが認証が必要な場合に発生します。

      返される配列には、Java Cryptography Architecture標準アルゴリズム名ドキュメントの「JSSE暗号スイート名」セクションの標準暗号スイート名のリストからの暗号スイートが含まれ、プロバイダがサポートする他の暗号スイートも含まれます。

      戻り値:
      暗号化方式群名の配列
      関連項目:
    • setEnabledCipherSuites

      public abstract void setEnabledCipherSuites(String[] suites)
      この接続で使用可能な暗号化方式群を設定します。

      suitesパラメータ内の各暗号化方式群はgetSupportedCipherSuites()でリストされている必要があります。そうでない場合、このメソッドは失敗します。 このメソッドの呼出しが成功したあと、suitesパラメータに示されている暗号化方式群のみが使用可能になります。

      暗号スイート名の標準リストは、Java暗号化アーキテクチャの標準アルゴリズム名のドキュメントの「JSSE暗号スイート名」セクションにあります。 プロバイダは、このリストにない暗号スイート名をサポートしているか、特定の暗号スイートの推奨名を使用していない可能性があります。

      なぜ特定の暗号化方式群を接続で使用することができないかについては、getEnabledCipherSuites()を参照してください。

      パラメータ:
      suites - 有効にするすべての暗号化方式群の名前
      例外:
      IllegalArgumentException - パラメータで指定された暗号化方式群の1つ以上がサポートされていないか、またはパラメータがnullである場合。
      関連項目:
    • getSupportedProtocols

      public abstract String[] getSupportedProtocols()
      SSL接続で使用可能にできるプロトコルの名前を返します。
      戻り値:
      サポートされているプロトコルの配列
    • getEnabledProtocols

      public abstract String[] getEnabledProtocols()
      この接続に対して現在使用可能になっているプロトコルの名前を返します。

      プロトコルが有効になっていても、決して使用されないことに注意してください。 これは、ピアがプロトコルをサポートしていないか、またはその使用が制限されているか、プロトコルによってサポートされている有効な暗号スイートがない場合に発生します。

      戻り値:
      プロトコルの配列
      関連項目:
    • setEnabledProtocols

      public abstract void setEnabledProtocols(String[] protocols)
      この接続で使用可能なプロトコルのバージョンを設定します。

      プロトコルは、getSupportedProtocols()により、サポート対象としてリストされていなければいけません。 このメソッドの呼出しが成功したあと、protocolsパラメータに示されているプロトコルのみが使用可能になります。

      パラメータ:
      protocols - 有効にするすべてのプロトコルの名前。
      例外:
      IllegalArgumentException - パラメータで指定されたプロトコルの1つ以上がサポートされていないか、またはprotocolsパラメータがnullである場合。
      関連項目:
    • getSession

      public abstract SSLSession getSession()
      この接続で使用されているSSLセッションを返します。 これらは有効期間が長く、ユーザーによってはログイン・セッション全体に対応することもあります。 セッションには、セッション内のすべての接続で使用される暗号化方式群と、セッションのクライアントとサーバーの識別情報が指定されています。

      このメソッドは、必要に応じて初期ハンドシェークを開始し、ハンドシェークが確立したときにブロックを解除します。

      初期ハンドシェークでエラーが発生すると、無効なセッション・オブジェクトが返され、「SSL_NULL_WITH_NULL_NULL」という無効な暗号化方式群が報告されます。

      戻り値:
      SSLSession
    • getHandshakeSession

      public SSLSession getHandshakeSession()
      SSL/TLSハンドシェーク時に構築中のSSLSessionを返します。

      TLSプロトコルでは、このクラスのインスタンスを使用しているとき、ただしSSLSessionが完全に初期化され、getSessionによって使用可能になる前に必要なパラメータのネゴシエーションを行う可能性があります。 たとえば、有効なシグネチャ・アルゴリズムのリストでは、TrustManagerのディシジョン時に使用できる証明書のタイプを制限したり、TLSフラグメント・パケット・サイズの最大値をネットワーク環境をよりサポートするためにサイズ変更したりできます。

      このメソッドでは、構築されているSSLSessionに早期にアクセスできます。 ハンドシェークの進捗状況によっては、一部のデータがまだ使用できない可能性があります。 たとえば、リモート・サーバーが証明書チェーンを送信しようとしているが、そのチェーンがまだ処理されていない場合、SSLSessiongetPeerCertificatesメソッドはSSLPeerUnverifiedExceptionをスローします。 そのチェーンの処理が完了すると、getPeerCertificatesは適切な値を返します。

      getSession()とは異なり、このメソッドは最初のハンドシェークを開始せず、ハンドシェークが完了するまでブロックしません。

      戻り値:
      このインスタンスが現在ハンドシェークしていない場合、または現在のハンドシェークが基本的なSSLSessionを作成できる程十分に進捗していない場合はnull。 それ以外の場合、このメソッドは、現在ネゴシエーションが行われているSSLSessionを返します。
      例外:
      UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。
      導入されたバージョン:
      1.7
      関連項目:
    • addHandshakeCompletedListener

      public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
      この接続のSSLハンドシェークの完了通知を受け取るためのイベント・リスナーを登録します。
      パラメータ:
      listener - HandShakeCompletedイベント・リスナー
      例外:
      IllegalArgumentException - 引数がnullである場合。
      関連項目:
    • removeHandshakeCompletedListener

      public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
      以前に登録されたハンドシェーク完了リスナーを削除します。
      パラメータ:
      listener - HandShakeCompletedイベント・リスナー
      例外:
      IllegalArgumentException - リスナーが登録されていない場合、または引数がnullである場合。
      関連項目:
    • startHandshake

      public abstract void startHandshake() throws IOException
      この接続上でSSLハンドシェークを開始します。 たとえば、新しい暗号化キーを使用する、暗号化方式群を変更する、新しいセッションを開始するなどが一般的な理由です。 完全な再認証を強制的に実行するには、ハンドシェークを開始する前に、現在のセッションを無効にする必要があります。

      すでに接続上に送信されたデータは、このハンドシェークが完了するまではそのままの状態を維持します。 ハンドシェークが完了するとイベントから信号を受け取ります。 このメソッドは、接続上の最初のハンドシェークと同時に開始され、ハンドシェークのネゴシエーションが完了すると終了します。 既存のソケット上での複数のハンドシェークをサポートしないプロトコルは、IOExceptionをスローします。

      例外:
      IOException - ネットワーク・レベルのエラー
      関連項目:
    • setUseClientMode

      public abstract void setUseClientMode(boolean mode)
      ハンドシェーク時、ソケットがクライアント(またはサーバー)モードを使用するように構成します。

      このメソッドは、すべてのハンドシェークの前に呼び出す必要があります。 いったんハンドシェークが開始されると、このソケットの寿命が尽きるまで、現在のモードをリセットすることはできません。

      通常、サーバーは自身を認証しますが、クライアントは必ずしもそうとはかぎりません。

      パラメータ:
      mode - ハンドシェークをクライアント・モードで開始する場合はtrue
      例外:
      IllegalArgumentException - 最初のハンドシェークが開始されてからモードを変更しようとした場合。
      関連項目:
    • getUseClientMode

      public abstract boolean getUseClientMode()
      ハンドシェーク時にクライアント・モードを使用するようにソケットが設定されている場合はtrue。
      戻り値:
      クライアント・モードでハンドシェークを行う場合はtrue
      関連項目:
    • setNeedClientAuth

      public abstract void setNeedClientAuth(boolean need)
      クライアント認証が必要なようにソケットを構成します。 このオプションは、サーバー・モードのソケットだけで使用します。

      ソケットのクライアント認証設定は、次のいずれかになります。

      • クライアント認証を必須にする
      • クライアント認証を要求する
      • クライアント認証を不要にする

      setWantClientAuth(boolean)と異なり、このオプションが設定されていて、かつクライアント認証情報が提供されない場合は、ネゴシエーションが停止し、接続が切断されます

      このメソッドを呼び出すと、このメソッドまたはsetWantClientAuth(boolean)によって行われた以前の設定がすべてオーバーライドされます。

      パラメータ:
      need - クライアント認証が必要な場合はtrueに、クライアント認証が不要な場合はfalseに設定される。
      関連項目:
    • getNeedClientAuth

      public abstract boolean getNeedClientAuth()
      ソケットにクライアント認証が必要な場合はtrueを返します。 このオプションは、サーバー・モードのソケットだけで使用します。
      戻り値:
      クライアント認証が必須の場合はtrue、クライアント認証が不要な場合はfalse。
      関連項目:
    • setWantClientAuth

      public abstract void setWantClientAuth(boolean want)
      クライアント認証を要求するようにソケットを構成します。 このオプションは、サーバー・モードのソケットだけで使用します。

      ソケットのクライアント認証設定は、次のいずれかになります。

      • クライアント認証を必須にする
      • クライアント認証を要求する
      • クライアント認証を不要にする

      setNeedClientAuth(boolean)とは異なり、このオプションが設定されていて、かつクライアントが自身に関する認証情報を提供しないことを選択した場合でも、ネゴシエーションは続行されます

      このメソッドを呼び出すと、このメソッドまたはsetNeedClientAuth(boolean)によって行われた以前の設定がすべてオーバーライドされます。

      パラメータ:
      want - クライアント認証が要求されている場合はtrueに、クライアント認証が不要な場合はfalseに設定される。
      関連項目:
    • getWantClientAuth

      public abstract boolean getWantClientAuth()
      ソケットがクライアント認証を要求する場合はtrueを返します。 このオプションは、サーバー・モードのソケットだけで使用します。
      戻り値:
      クライアント認証が要求された場合はtrue、クライアント認証が不要な場合はfalse。
      関連項目:
    • setEnableSessionCreation

      public abstract void setEnableSessionCreation(boolean flag)
      このソケットで新しいSSLセッションを確立できるかどうかを制御します。 セッションを作成できず、再開できる既存のセッションがない場合、ハンドシェークは成功しません。
      パラメータ:
      flag - セッションを作成できる場合はtrue (デフォルト)。既存のセッションを再開する場合はfalse
      関連項目:
    • getEnableSessionCreation

      public abstract boolean getEnableSessionCreation()
      このソケットで新しいSSLセッションを確立できる場合はtrueを返します。
      戻り値:
      セッションを作成できる場合はtrue (デフォルト)。既存のセッションを再開する場合はfalse
      関連項目:
    • getSSLParameters

      public SSLParameters getSSLParameters()
      このSSLSocketで有効なSSLParametersを返します。 返されるSSLParametersの暗号化方式群とプロトコルは、常にnull以外です。
      戻り値:
      このSSLSocketで有効なSSLParameters。
      導入されたバージョン:
      1.6
    • setSSLParameters

      public void setSSLParameters(SSLParameters params)
      このソケットにSSLParametersを適用します。

      これは次のことを意味します。

      • params.getCipherSuites()がnull以外の場合は、その値を使用してsetEnabledCipherSuites()が呼び出される。
      • params.getProtocols()がnull以外の場合は、その値を使用してsetEnabledProtocols()が呼び出される。
      • params.getNeedClientAuth()またはparams.getWantClientAuth()trueを返した場合は、それぞれsetNeedClientAuth(true)setWantClientAuth(true)が呼び出される。それ以外の場合はsetWantClientAuth(false)が呼び出される。
      • params.getServerNames()がnull以外の場合、ソケットはサーバー名をその値で構成する。
      • params.getSNIMatchers()がnull以外の場合、ソケットはSNIマッチャをその値で構成する。

      パラメータ:
      params - パラメータ
      例外:
      IllegalArgumentException - setEnabledCipherSuites()またはsetEnabledProtocols()の呼出しが失敗した場合
      導入されたバージョン:
      1.6
    • getApplicationProtocol

      public String getApplicationProtocol()
      この接続でネゴシエートされた最新のアプリケーション・プロトコル値を返します。

      基になるSSL/TLS/DTLS実装でサポートされている場合、RFC 7301、アプリケーション層プロトコル・ネゴシエーション(ALPN)などのアプリケーション・ネーム・ネゴシエーション・メカニズムは、ピア間のアプリケーション・レベルの値をネゴシエートできます。

      実装要件:
      このクラスの実装は、UnsupportedOperationExceptionをスローし、他のアクションを実行しません。
      戻り値:
      アプリケーション・プロトコルがこの接続に使用されるかどうかまだ判定されていない場合はnull、アプリケーション・プロトコル値が使用されない場合は空のString、値が正常にネゴシエートされた場合は空のアプリケーション・プロトコルString
      例外:
      UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。
      導入されたバージョン:
      9
    • getHandshakeApplicationProtocol

      public String getHandshakeApplicationProtocol()
      現在進行中のSSL/TLSハンドシェイクでネゴシエートされたアプリケーション・プロトコル値を返します。

      getHandshakeSession()と同様に、接続はハンドシェイクの途中にある可能性があります。 アプリケーション・プロトコルはまだ利用可能であるかもしれないし、利用可能でないかもしれません。

      実装要件:
      このクラスの実装は、UnsupportedOperationExceptionをスローし、他のアクションを実行しません。
      戻り値:
      アプリケーション・プロトコルがこのハンドシェイクに使用されるかどうかまだ判定されていない場合はnull、アプリケーション・プロトコル値が使用されない場合は空のString、値が正常にネゴシエートされた場合は空ではないアプリケーション・プロトコルString
      例外:
      UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。
      導入されたバージョン:
      9
    • setHandshakeApplicationProtocolSelector

      public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector)
      SSL/TLS/DTLSハンドシェイクのアプリケーション・プロトコル値を選択するコールバック関数を登録します。 この関数は、SSLParameters.setApplicationProtocolsを使用して指定された値をオーバーライドし、次の型パラメータをサポートします:
      SSLSocket
      最初の引数は、ハンドシェーク・セッションや構成を含め、現在のSSLSocketを検査できるようにします。
      List<String>
      関数の第2引数は、TLSピアによって通知されたアプリケーション・プロトコル名をリストします。
      String
      関数の結果はアプリケーションのプロトコル名であり、宣言された名前のどれも受け入れられないことを示すためにはnullです。 戻り値が空のStringの場合、アプリケーション・プロトコルの指示は使用されません。 戻り値がnull (値が選択されていない)またはピアによって宣言されていない値である場合、基になるプロトコルは、実行するアクションを決定します。 (たとえば、ALPNは"no_application_protocol"アラートを送信し、接続を終了します。)
      たとえば、次の呼び出しは、TLSハンドシェイク・パラメータを調べてアプリケーション・プロトコル名を選択するコールバック関数を登録します:
      
           serverSocket.setHandshakeApplicationProtocolSelector(
               (serverSocket, clientProtocols) -> {
                   SSLSession session = serverSocket.getHandshakeSession();
                   return chooseApplicationProtocol(
                       serverSocket,
                       clientProtocols,
                       session.getProtocol(),
                       session.getCipherSuite());
               });
       
      APIのノート:
      このメソッドは、TLSハンドシェイクが開始される前にTLSサーバー・アプリケーションによって呼び出される必要があります。 また、このSSLSocketは、コールバック関数で選択されたアプリケーション・プロトコルと互換性のあるパラメータで構成する必要があります。 たとえば、暗号スイートの選択肢を誤ると、適切なアプリケーション・プロトコルが得られない可能性があります。 SSLParametersを参照してください。
      実装要件:
      このクラスの実装は、UnsupportedOperationExceptionをスローし、他のアクションを実行しません。
      パラメータ:
      selector - コールバック関数、または登録解除の場合はnull。
      例外:
      UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。
      導入されたバージョン:
      9
    • getHandshakeApplicationProtocolSelector

      public BiFunction<SSLSocket,List<String>,String> getHandshakeApplicationProtocolSelector()
      SSL/TLS/DTLSハンドシェイク中にアプリケーション・プロトコル値を選択するコールバック関数を取得します。 関数型パラメータについては、setHandshakeApplicationProtocolSelectorを参照してください。
      実装要件:
      このクラスの実装は、UnsupportedOperationExceptionをスローし、他のアクションを実行しません。
      戻り値:
      コールバック関数。何も設定されていない場合はnull。
      例外:
      UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。
      導入されたバージョン:
      9