クラスSSLEngine
セキュア通信モードでは、次のセキュリティ保護が実施されます。
- 整合性の保護 SSL/TLS/DTLSは、アクティブなワイヤタッパによるメッセージの変更から保護します。
- 認証。 ほとんどのモードでは、SSL/TLS/DTLSはピア認証を提供します。 通常は、サーバー認証が行われる。サーバーからの要求に応じて、クライアント認証も行われる。
- 機密性(プライバシの保護) ほとんどのモードでは、SSL/TLS/DTLSはクライアントとサーバーの間で送信されるデータを暗号化します。 この結果、受動的な盗聴によって、金融情報や個人情報などの機密性の高いデータが盗聴されることがない。
使用される暗号化方式群は、「ハンドシェーク」と呼ばれるネゴシエーション・プロセスによって確立されます。 ハンドシェークでは、セッションの作成またはセッションへの参加が行われます。このセッションは、時間の経過とともにさまざまな接続を保護します。 ハンドシェークが完了すると、getSession()メソッドを使用してセッション属性にアクセスできます。
SSLSocketクラスは、ほぼ同じセキュリティ機能を提供しますが、すべてのインバウンドおよびアウトバウンド・データは、基礎となるSocketを使用して自動的に転送されます。このデータは、設計によってブロック・モデルを使用します。 この処理は多くのアプリケーションに対して適切ですが、このモデルは大規模サーバーに必要な拡張性をもたらしません。
SSLEngineの主な特長として、転送メカニズムに依存することなくインバウンド/アウトバウンドのバイト・ストリームに作用する点があげられます。 SSLEngineユーザーは、ピアに対する入出力転送の信頼性を確保する必要があります。 SSL/TLS/DTLS抽象化をI/Oトランスポート・メカニズムから分離することで、SSLEngineは、non-blocking I/O (polling)、selectable non-blocking I/O、Socket、従来のInput/OutputStreams、ローカルByteBuffersまたはバイト配列、「将来の非同期I/Oモデル」などの様々なI/Oタイプに使用できます。
高レベルでは、SSLEngineは次のように表されます。
app data
| ^
| | |
v | |
+----+-----|-----+----+
| | |
| SSL|Engine |
wrap() | | | unwrap()
| OUTBOUND | INBOUND |
| | |
+----+-----|-----+----+
| | ^
| | |
v |
net data
アプリケーション・データ(別名「プレーン・テキスト」または「クリアテキスト」)は、アプリケーションによって生成または使用されるデータです。 アプリケーション・データと対になるものとして、ネットワーク・データがあります。ネットワーク・データは、ハンドシェークまたは暗号文(暗号化された)、またはその両方のいずれかで構成され、入出力メカニズムを介して転送されるデータです。 インバウンド・データはピアから受信されるデータ、アウトバウンド・データはピアへ送信されるデータです。
SSLEngineのコンテキストでは、セキュア接続の確立および制御目的で交換されるデータを「ハンドシェーク・データ」と総称します。 ハンドシェイク・データには、SSL/TLS/DTLSメッセージ"alert"、"change_cipher_spec,"、および"handshake."が含まれます)
SSLEngineは、次の5つの段階をたどります。
- 作成 -
SSLEngineの作成と初期化は完了しましたが、まだ使用されてはいません。 この段階では、アプリケーションにより、SSLEngine固有のあらゆる設定(暗号化方式群の有効化、SSLEngineがクライアント・モードとサーバー・モードのどちらでハンドシェークを行うかなど)を行うことができます。 ハンドシェークが始まると、次のハンドシェークからクライアント/サーバー・モードの設定を除く(下記参照)新しい設定が使用されます。 - 初期ハンドシェーク - SSLSessionが確立されるまでの間、2つのピアが通信パラメータを交換する手続きです。 この段階では、アプリケーション・データは送信できません。
- アプリケーション・データ - 通信パラメータが確立され、ハンドシェークが完了すると、
SSLEngineからアプリケーション・データが送信されます。 アウトバウンド・アプリケーション・メッセージは暗号化され、データの整合性が確保されます。インバウンド・メッセージでは、この逆の手続きが行われます。 - 再ハンドシェーク -「アプリケーション・データ」段階の間はいつでも、どちら側のピアからでも、必要に応じてセッションの再ネゴシエーションを要求できます。 アプリケーション・データに新しいハンドシェーク・データを混合できます。 再ハンドシェーク・フェーズを開始する前に、アプリケーションは、有効な暗号スイートのリストやクライアント認証を使用するかどうかなどのSSL/TLS/DTLS通信パラメータをリセットすることができますが、クライアント/サーバー・モード間で変更することはできません。 前回と同様に、ハンドシェークが始まってから次のハンドシェークまで、新しい
SSLEngine構成設定は使用されません。 - クローズ - 接続が不要になった場合、クライアントとサーバー・アプリケーションは、それぞれの接続の両側を閉じる必要があります。
SSLEngineオブジェクトの場合、アプリケーションはcloseOutbound()を呼び出し、残りのメッセージをピアに送信する必要があります。 同様に、アプリケーションはcloseInbound()を呼び出す前にピアから残りのメッセージを受信する必要があります。 その後、SSLEngineの両側が閉じられた後に、配下の転送メカニズムを閉じることができます。 適切な方法で(たとえば、ピアの書込み閉包通知を受信する前にcloseInbound()がコールされます。)に接続がクローズされない場合、エラーが発生したことを示す例外が発生します。 いったん閉じられたエンジンを再利用することはできません。新しいSSLEngineを作成する必要があります。
SSLEngineを作成するには、初期化されたSSLContextからSSLContext.createSSLEngine()を呼び出します。 wrap()、unwrap()、またはbeginHandshake()を最初に呼び出す前に、任意の構成パラメータを構成してください。 これらのメソッドはすべて、初期ハンドシェークをトリガーします。
エンジン内でデータを移動するには、アウトバウンド・データの場合はwrap()、インバウンド・データの場合はunwrap()をそれぞれ呼び出します。 SSLEngineの状態によっては、wrap()呼出しによってソース・バッファからアプリケーション・データが消費され、宛先バッファにネットワーク・データが生成される場合もあります。 アウトバウンド・データには、アプリケーション・データまたはハンドシェーク・データ、あるいはその両方が含まれます。 unwrap()を呼び出すと、ソース・バッファがチェックされ、データがハンドシェーク情報であればハンドシェークが実施されます。アプリケーションであれば、アプリケーション・データが宛先バッファに格納されます。 基礎となるSSL/TLS/DTLSアルゴリズムの状態によって、データがいつ消費および生成されるかが決まります。
wrap()やunwrap()を呼び出すと、オペレーションの状態と、処理を続行する場合のエンジンとのやりとりの内容(オプション)を示すSSLEngineResultが返されます。
SSLEngineは、完全なSSL/TLS/DTLSパケットのみを生成/消費し、wrap()/unwrap()へのコール間でアプリケーション・データを内部的に格納しません。 したがって、生成されるレコードのうち最大のものを格納できるように、入出力ByteBufferのサイズを決定する必要があります。 適切なバッファ・サイズを決定するには、SSLSession.getPacketBufferSize()やSSLSession.getApplicationBufferSize()の呼び出しを使用する必要があります。 アウトバウンド・アプリケーション・データのバッファ・サイズは、通常、考慮する必要はありません。 データの使用および生成に適したバッファ条件でない場合、アプリケーションはSSLEngineResultによって問題を特定し、修正したあと、再度呼出しを試行しなければいけません。
たとえば、有効な宛先バッファの容量が不十分であるとエンジンが判定した場合、unwrap()はSSLEngineResult.Status.BUFFER_OVERFLOWの結果を返します。 必要に応じて、アプリケーションでSSLSession.getApplicationBufferSize()を呼び出し、その値と宛先バッファ内の有効な容量を比較して、バッファを大きくするようにしてください。 同様に、unwrap()がSSLEngineResult.Status.BUFFER_UNDERFLOWを返そうとした場合は、アプリケーションでSSLSession.getPacketBufferSize()を呼び出して、レコードを保持するのに十分な容量をソース・バッファに確保し(また、必要に応じて拡張し)、より多くの着信データを取得するようにしてください。
SSLEngineResult r = engine.unwrap(src, dst);
switch (r.getStatus()) {
case BUFFER_OVERFLOW:
// Could attempt to drain the dst buffer of any already obtained
// data, but we'll just increase it to the size needed.
int appSize = engine.getSession().getApplicationBufferSize();
ByteBuffer b = ByteBuffer.allocate(appSize + dst.position());
dst.flip();
b.put(dst);
dst = b;
// retry the operation.
break;
case BUFFER_UNDERFLOW:
int netSize = engine.getSession().getPacketBufferSize();
// Resize buffer if needed.
if (netSize > src.capacity()) {
ByteBuffer b = ByteBuffer.allocate(netSize);
src.flip();
b.put(src);
src = b;
}
// Obtain more inbound network data for src,
// then retry the operation.
break;
// other cases: CLOSED, OK.
}
SSLSocketとは異なり、SSLEngineのメソッドはすべて非ブロックになります。 SSLEngine実装は、完了までに長い時間がかかったり、ブロックしてしまう可能性のあるタスクの結果を必要とする可能性があります。 たとえば、TrustManagerでは、リモート証明書検証サービスへの接続が必要になる場合があります。また、KeyManagerは、クライアント認証の一環として使用する証明書を決定するようにユーザーに要求する必要がある場合があります。 さらに、暗号化署名を作成し、これらを検証する場合、処理時間がかなり長くなり、処理がブロックされたように見えることがあります。
SSLEngineは、ブロックされる可能性があるあらゆるオペレーションに対して、Runnable委譲タスクを生成します。 SSLEngineResultにより、委譲タスクの結果の必要性が示された場合、アプリケーションはgetDelegatedTask()を呼び出して未処理の委譲タスクを取得し、そのrun()メソッドを呼び出す必要があります。呼出しに使用されるスレッドは、計算方法によって異なります。 アプリケーションは、すべての委譲タスクを取得すると、元の操作を再試行します。
通信セッションの最後に、アプリケーションはSSL/TLS/DTLSリンクを適切にクローズする必要があります。 SSL/TLS/DTLSプロトコルにはクローズ・ハンドシェイク・メッセージがあり、これらのメッセージは、SSLEngineを解放して基礎となるトランスポート・メカニズムを閉じる前にピアに通信する必要があります。 通信セッションの終了は、SSLException、ハンドシェーク終了メッセージの着信、または任意の終了メソッドによって開始されます。 どの場合でも、エンジンからハンドシェーク終了メッセージが生成され、SSLEngineResultの状態がCLOSEDになるか、isOutboundDone()の戻り値がtrueになるまで、wrap()が繰返し呼び出されます。 wrap()メソッドによって取得されたデータはすべてピアに送信されます。
アプリケーションから送信されるデータがもうないことをエンジンに通知するには、closeOutbound()を使用します。
ピアは、固有のハンドシェーク終了メッセージを送信することで、終了の意図を通知します。 このメッセージがローカルのSSLEngineのunwrap()呼出しによって受信および処理されると、アプリケーションは、unwrap()を呼び出し、ステータスがCLOSEDのSSLEngineResultを検索します。条件に合うものが見つかるか、isInboundDone()の戻り値がtrueであれば、終了が確認されます。 なんらかの理由でピアが適切なSSL/TLS/DTLSクローズ・メッセージを送信せずに通信リンクを閉じる場合、アプリケーションはストリームの終わりを検出し、処理するインバウンド・メッセージはこれ以上ないことをcloseInbound()経由でエンジンに通知できます。 アプリケーションによっては、ピアからのシャットダウン・メッセージを順序どおりに受け取るように要求する設定になっている場合があります。このような場合、アプリケーションはストリームの終了位置の条件ではなく、ハンドシェーク・メッセージによって終了をチェックできます。
暗号化方式群を使用するときは、2つのグループについて理解する必要があります。
- サポートされる暗号化方式群: SSL実装でサポートされるすべての暗号化方式群。 このリストは、
getSupportedCipherSuites()を使用して報告される。 - 有効になっている暗号化方式群。サポートされる暗号化方式群の完全なセットより少ないことがある。 このグループは、
setEnabledCipherSuites(String[])メソッドを使用して設定し、getEnabledCipherSuites()メソッドを使用して照会する。 新しいエンジンでは、最小限の推奨構成を表すデフォルトの暗号化方式群が使用可能になっている。
各SSL/TLS/DTLS接続には1つのクライアントと1つのサーバーが必要であるため、各エンドポイントはどのロールを引き受けるかを決定する必要があります。 この選択内容によって、どちら側からハンドシェーク処理を開始するか、また、お互いにどのタイプのメッセージを送信するかが決まります。 setUseClientMode(boolean)メソッドはモードを構成します。 新しいSSLEngineのデフォルト・モードはプロバイダ固有であることに注意してください。 アプリケーションでは、SSLEngineの他のメソッドを呼び出す前に、モードを明示的に設定する必要があります。 いったん初期ハンドシェークが開始されてからは、再ネゴシエーションを実行する場合でも、SSLEngineのモードをクライアントからサーバー、サーバーからクライアントに切り替えることはできません。
このクラスのメソッドによって返されるApplicationProtocol String値は、ピアによって送信されるネットワーク・バイト表現内にあります。 バイトは、比較のために直接比較するか、UnicodeのString形式に変換できます。
String networkString = sslEngine.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")) {
...
}
並行処理のノート: 次の2点に注意してください。
wrap()メソッドとunwrap()メソッドは、並行実行が可能です。- SSL/TLS/DTLSプロトコルは、順序付けされたパケットを使用します。 アプリケーションは、生成されたパケットが正しい順番で配信する必要があります。 パケットの到着順序が正しくないと、予期しない結果または致命的な結果を招くことがあります。
たとえば、
synchronized (outboundLock) { sslEngine.wrap(src, dst); outboundQueue.put(dst); }最終的なパケットの順序を保証することができないので、結果的に、2つのスレッドが同じメソッド(wrap()またはunwrap())を並行して呼び出すことはできません。
- 導入されたバージョン:
- 1.5
- 外部仕様
- 関連項目:
-
コンストラクタのサマリー
コンストラクタ -
メソッドのサマリー
修飾子と型メソッド説明abstract voidこのSSLEngineの初期ハンドシェークまたは再ネゴシエーションのハンドシェークを開始します。abstract voidこのSSLEngineにこれ以上の着信ネットワーク・データが送信されないことを示す信号。abstract voidこのSSLEngineでこれ以上の送信アプリケーション・データが送信されないことを示す信号。この接続に対してネゴシエートされた最新のアプリケーション・プロトコル値を返します。abstract RunnableこのSSLEngineに委譲されたRunnableタスクを返します。abstract String[]このエンジンで現在使用可能になっているSSL暗号化方式群の名前を返します。abstract String[]このSSLEngineで現在使用可能になっているプロトコル・バージョンの名前を返します。abstract booleanこのエンジンで新しいSSLセッションを確立できる場合はtrueを返します。現在進行中のSSL/TLSハンドシェイクでネゴシエーションされたアプリケーション・プロトコル値を返します。SSL/TLS/DTLSハンドシェイク中にアプリケーション・プロトコル値を選択するコールバック関数を取得します。SSL/TLS/DTLSハンドシェイク中に構築されるSSLSessionを返します。abstract SSLEngineResult.HandshakeStatusこのSSLEngineの現在のハンドシェーク状態を返します。abstract booleanエンジンにクライアント認証が必要な場合はtrueを返します。ピアのホスト名を返します。intピアのポート番号を返します。abstract SSLSessionこのSSLEngineで使用されているSSLSessionを返します。このSSLEngineで有効なSSLParametersを返します。abstract String[]このエンジンで使用可能にできる暗号化方式群の名前を返します。abstract String[]このSSLEngineで使用可能にできるプロトコルの名前を返します。abstract booleanハンドシェーク時にクライアント・モードを使用するようにエンジンが設定されている場合はtrue。abstract booleanエンジンがクライアント認証を要求する場合はtrueを返します。abstract booleanunwrap(ByteBuffer, ByteBuffer)がこれ以上の着信データ・メッセージを受け入れるかどうかを返します。abstract booleanwrap(ByteBuffer, ByteBuffer)がこれ以上の送信データ・メッセージを生成するかどうかを返します。abstract voidsetEnabledCipherSuites(String[] suites) このエンジンで使用可能な暗号化方式群を設定します。abstract voidsetEnabledProtocols(String[] protocols) このエンジンで使用可能なプロトコルのバージョンを設定します。abstract voidsetEnableSessionCreation(boolean flag) このエンジンで新しいSSLセッションを確立できるかどうかを制御します。voidsetHandshakeApplicationProtocolSelector(BiFunction<SSLEngine, List<String>, String> selector) SSL/TLS/DTLSハンドシェイクのアプリケーション・プロトコル値を選択するコールバック関数を登録します。abstract voidsetNeedClientAuth(boolean need) クライアント認証が必要なようにエンジンを構成します。voidsetSSLParameters(SSLParameters params) このエンジンにSSLParametersを適用します。abstract voidsetUseClientMode(boolean mode) ハンドシェーク時、エンジンがクライアント(またはサーバー)モードを使用するように構成します。abstract voidsetWantClientAuth(boolean want) クライアント認証を要求するようにエンジンを構成します。unwrap(ByteBuffer src, ByteBuffer dst) SSL/TLS/DTLSネットワーク・データをプレーン・テキスト・アプリケーション・データ・バッファにデコードしようとします。unwrap(ByteBuffer src, ByteBuffer[] dsts) SSL/TLS/DTLSネットワーク・データを一連のプレーン・テキスト・アプリケーション・データ・バッファにデコードしようとします。abstract SSLEngineResultunwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length) SSL/TLS/DTLSネットワーク・データをプレーン・テキスト・アプリケーション・データ・バッファのサブシーケンスにデコードしようとします。abstract SSLEngineResultwrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst) データ・バッファのサブシーケンスからSSL/TLS/DTLSネットワーク・データへのプレーン・テキスト・バイトのエンコードを試みます。wrap(ByteBuffer[] srcs, ByteBuffer dst) 一連のデータ・バッファからSSL/TLS/DTLSネットワーク・データへのプレーン・テキスト・バイトのエンコードを試みます。wrap(ByteBuffer src, ByteBuffer dst) プレーン・テキスト・アプリケーション・データのバッファをSSL/TLS/DTLSネットワーク・データにエンコードしようとします。
-
コンストラクタの詳細
-
SSLEngine
protected SSLEngine()内部セッションの再利用方法に関するヒントを提供しないSSLEngineのコンストラクタ。- 関連項目:
-
SSLEngine
protected SSLEngine(String peerHost, int peerPort) SSLEngineのコンストラクタ。SSLEngine実装は、内部セッションを再利用するためのヒントとして、peerHostパラメータとpeerPortパラメータを使用できます。Kerberosなど、リモート・ホスト名の情報を必要とする暗号化方式群もあります。 このクラスの実装は、このコンストラクタを使ってKerberosを使用します。
パラメータは、
SSLEngineによる認証を受けません。- パラメータ:
peerHost- ピアのホスト名peerPort- ピアのポート番号- 関連項目:
-
-
メソッドの詳細
-
getPeerHost
public String getPeerHost()ピアのホスト名を返します。この値は認証されていないため、実際に使用することはできません。
- 戻り値:
- ピアのホスト名。使用できるものがない場合はnull。
-
getPeerPort
public int getPeerPort()ピアのポート番号を返します。この値は認証されていないため、実際に使用することはできません。
- 戻り値:
- ピアのポート番号。使用できるものがない場合は -1。
-
wrap
public SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst) throws SSLException プレーン・テキスト・アプリケーション・データのバッファをSSL/TLS/DTLSネットワーク・データにエンコードしようとします。このメソッド呼出しの動作は、次の呼出しの動作とまったく同じです。
engine.wrap(new ByteBuffer[] { src }, 0, 1, dst);- パラメータ:
src- アウトバウンド・アプリケーション・データを格納するByteBufferdst- 送信ネットワーク・データを保持するByteBuffer- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。ReadOnlyBufferException-dstバッファが読取り専用である場合。IllegalArgumentException-srcまたはdstのいずれかがnullの場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
wrap
public SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst) throws SSLException 一連のデータ・バッファからSSL/TLS/DTLSネットワーク・データへのプレーン・テキスト・バイトのエンコードを試みます。このメソッド呼出しの動作は、次の呼出しの動作とまったく同じです。
engine.wrap(srcs, 0, srcs.length, dst);- パラメータ:
srcs- 送信アプリケーション・データを含むByteBuffersの配列dst- 送信ネットワーク・データを保持するByteBuffer- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。ReadOnlyBufferException-dstバッファが読取り専用である場合。IllegalArgumentException-srcsとdstのどちらかがnullの場合、またはsrcs内のいずれかの要素がnullである場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
wrap
public abstract SSLEngineResult wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst) throws SSLException データ・バッファのサブシーケンスからSSL/TLS/DTLSネットワーク・データへのプレーン・テキスト・バイトのエンコードを試みます。 この収集オペレーションは、1回の呼出しで、単一のバイト・シーケンスを1つ以上の指定のバッファ・シーケンスへエンコードできます。 ラップ収集は、通常、ネットワーク・プロトコルやファイル形式(たとえば、データを1個以上の固定長のヘッダーと可変長の本体から成るセグメントにグループ化するようなファイル形式)を実装する際に便利です。 収集の詳細はGatheringByteChannel、収集後の動作の詳細はGatheringByteChannel.write(ByteBuffer[], int, int)を参照してください。SSLEngineの状態によっては、このメソッドは、アプリケーション・データを一切使用しないでネットワーク・データを生成することがあります。たとえば、ハンドシェーク・データがこれに該当します。
アプリケーションは、ネットワーク・データをピアに安全に転送する必要があります。また、何回かのwrap()の呼出しによって生成されたデータを生成順に転送する必要があります。 アプリケーションは、このメソッドの複数の呼出しを正しく同期化する必要があります。
この
SSLEngineがまだ初期ハンドシェークを開始していない場合は、このメソッドによって初期ハンドシェークが自動的に開始されます。このメソッドは、SSL/TLS/DTLSレコードの作成を試行し、可能なかぎり多くのソース・データを消費しますが、各バッファに残っているバイトの合計を超える消費はしません。 各
ByteBufferの位置は、消費または生成されたデータの量を反映するように更新されます。 上限/下限値は変わりません。srcsおよびdst ByteBufferは、配下にあるそれぞれ別々のメモリーを使用する必要があります。エンジンの終了の詳細は、クラスの説明を参照。
- パラメータ:
srcs- 送信アプリケーション・データを含むByteBuffersの配列offset- バイトの取得元となる最初のバッファ配列内のオフセット。srcs.length以下の負でない値である必要がありますlength- アクセスされる最大バッファ数。srcs.length-offset以下の負でない値である必要がありますdst- 送信ネットワーク・データを保持するByteBuffer- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。IndexOutOfBoundsException-offsetパラメータとlengthパラメータの前提条件が満たされていない場合。ReadOnlyBufferException-dstバッファが読取り専用である場合。IllegalArgumentException-srcsとdstのどちらかがnullの場合、または指定されたsrcsサブシーケンス内のいずれかの要素がnullである場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
unwrap
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException SSL/TLS/DTLSネットワーク・データをプレーン・テキスト・アプリケーション・データ・バッファにデコードしようとします。このメソッド呼出しの動作は、次の呼出しの動作とまったく同じです。
engine.unwrap(src, new ByteBuffer[] { dst }, 0, 1);- パラメータ:
src- 着信ネットワーク・データを含むByteBuffer。dst- インバウンド・アプリケーション・データを格納するByteBuffer。- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。ReadOnlyBufferException-dstバッファが読取り専用である場合。IllegalArgumentException-srcまたはdstのいずれかがnullの場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
unwrap
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts) throws SSLException SSL/TLS/DTLSネットワーク・データを一連のプレーン・テキスト・アプリケーション・データ・バッファにデコードしようとします。このメソッド呼出しの動作は、次の呼出しの動作とまったく同じです。
engine.unwrap(src, dsts, 0, dsts.length);- パラメータ:
src- 着信ネットワーク・データを含むByteBuffer。dsts- 着信アプリケーション・データを保持するByteBufferの配列。- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。ReadOnlyBufferException- いずれかのdstバッファが読取り専用の場合。IllegalArgumentException-srcとdstsのどちらかがnullの場合、またはdsts内のいずれかの要素がnullである場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
unwrap
public abstract SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length) throws SSLException SSL/TLS/DTLSネットワーク・データをプレーン・テキスト・アプリケーション・データ・バッファのサブシーケンスにデコードしようとします。 この散布オペレーションは、1回の呼出しで、単一のバイト・シーケンスを1つ以上の指定のバッファ・シーケンスへデコードできます。 分散するアンラップは、通常、ネットワーク・プロトコルやファイル形式(たとえば、データを1個以上の固定長のヘッダーと可変長の本体から成るセグメントにグループ化するようなファイル形式)を実装する際に便利です。 散布の詳細はScatteringByteChannel、散布後の動作の詳細はScatteringByteChannel.read(ByteBuffer[], int, int)を参照してください。SSLEngineの状態によっては、このメソッドは、アプリケーション・データを一切生成しないでネットワーク・データを使用することがあります。たとえば、ハンドシェーク・データがこれに該当します。
アプリケーションは、ピアからネットワーク・データを安全に取得する必要があります。また、受信した順にデータのラップを解除(unwrap()呼び出し)する必要があります。 アプリケーションは、このメソッドの複数の呼出しを正しく同期化する必要があります。
この
SSLEngineがまだ初期ハンドシェークを開始していない場合は、このメソッドによって初期ハンドシェークが自動的に開始されます。このメソッドは、1つの完全なSSL/TLS/DTLSネットワーク・パケットを消費しようとしますが、バッファに残っているバイトの合計を超えて消費することはありません。 各
ByteBufferの位置は、消費または生成されたデータの量を反映するように更新されます。 上限/下限値は変わりません。srcおよびdsts ByteBufferは、配下にあるそれぞれ別々のメモリーを使用する必要があります。インバウンド・ネットワーク・バッファ
srcは、このコールの結果として変更できます: したがって、ネットワーク・データ・パケットが何らかの二次的な目的に必要な場合は、このメソッドを呼び出す前にデータを複製する必要があります。 ノート: 各SSLEngineには、SSL/TLS/DTLSメッセージに影響する一意のランダムな状態が含まれるため、ネットワーク・データは2番目のSSLEngineには役立ちません。エンジンの終了の詳細は、クラスの説明を参照。
- パラメータ:
src- 着信ネットワーク・データを含むByteBuffer。dsts- 着信アプリケーション・データを保持するByteBufferの配列。offset- 最初のバイトの転送先となるバッファ配列内のオフセット。dsts.length以下のゼロまたは正の数。length- アクセスされる最大バッファ数。dsts.length-offset以下の負でない値である必要があります。- 戻り値:
- このオペレーションの結果を説明する
SSLEngineResult。 - スロー:
SSLException- データの処理中に問題が検出され、それがSSLEngineの異常終了の原因になった場合。 エンジンの終了の詳細は、クラスの説明を参照。IndexOutOfBoundsException-offsetパラメータとlengthパラメータの前提条件が満たされていない場合。ReadOnlyBufferException- いずれかのdstバッファが読取り専用の場合。IllegalArgumentException-srcとdstsのどちらかがnullの場合、または指定されたdstsサブシーケンス内のいずれかの要素がnullである場合。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
getDelegatedTask
public abstract Runnable getDelegatedTask()このSSLEngineに委譲されたRunnableタスクを返します。SSLEngineオペレーションに必要なオペレーションの結果がブロックされたり、完了までにかなりの時間がかかることがあります。 このメソッドは、未処理のRunnableオペレーション(タスク)を取得するために使用されます。 各タスクには、runオペレーションを実行するスレッド(現在のスレッドも可)を割り当てる必要があります。runメソッドが終了したあと、不要になったRunnableオブジェクトは廃棄可能です。このメソッドの呼出しは、未処理のタスクをそれぞれ1回だけ返します。
委譲された複数のタスクを並列実行することもできます。
- 戻り値:
- 委譲された
Runnableタスク。使用できるものがない場合はnull。
-
closeInbound
public abstract void closeInbound() throws SSLExceptionこのSSLEngineにこれ以上の着信ネットワーク・データが送信されないことを示す信号。アプリケーションが
closeOutbound()を呼び出して終了処理を開始したとき、ピアの対応する終了メッセージを待つ必要がない場合があります。 (終了の警告の待機に関する詳細は、TLS仕様のセクション7.2.1(RFC 2246)を参照)。 この場合、このメソッドの呼出しは不要です。ただし、アプリケーションがクローズ・プロセスを開始しなかった場合、または前述の状況が適用されない場合は、SSL/TLS/DTLSデータ・ストリームの終わりに達するたびにこのメソッドをコールする必要があります。 これにより、インバウンド側が確実にクローズされ、ピアがSSL/TLS/DTLSクローズ・プロシージャを正しく実行したことを確認して、切捨て攻撃の可能性を検出します。
このメソッドは、べき等です。着信側がすでに終了している場合は、何も行いません。
残りのハンドシェーク・データをフラッシュするには、
wrap()を呼び出すようにしてください。- スロー:
SSLException- このエンジンがピアから適切なSSL/TLS/DTLSクローズ通知メッセージを受信していない場合。- 外部仕様
- 関連項目:
-
isInboundDone
public abstract boolean isInboundDone()unwrap(ByteBuffer, ByteBuffer)がこれ以上の着信データ・メッセージを受け入れるかどうかを返します。- 戻り値:
SSLEngineがこれ以上ネットワーク・データ(つまり、これ以上アプリケーション・データは生成されません。)を使用しない場合、true- 関連項目:
-
closeOutbound
public abstract void closeOutbound()このSSLEngineでこれ以上の送信アプリケーション・データが送信されないことを示す信号。このメソッドは、べき等です。送信側がすでに終了している場合は、何も行いません。
残りのハンドシェーク・データをフラッシュするには、
wrap(ByteBuffer, ByteBuffer)を呼び出すようにしてください。- 関連項目:
-
isOutboundDone
public abstract boolean isOutboundDone()wrap(ByteBuffer, ByteBuffer)がこれ以上の送信データ・メッセージを生成するかどうかを返します。終了段階で、
SSLEngineは、ピアに送信するハンドシェーク終了データを生成します。このデータを生成するには、wrap()を呼び出す必要があります。 このメソッドの戻り値がtrueの場合、これ以上アウトバウンド・データは生成されません。- 戻り値:
SSLEngineがこれ以上ネットワーク・データを生成しない場合はtrue- 関連項目:
-
getSupportedCipherSuites
public abstract String[] getSupportedCipherSuites()このエンジンで使用可能にできる暗号化方式群の名前を返します。 通常は、その一部のみがデフォルトで使用可能になります。デフォルトのサービス品質要件を満たしていない暗号化方式群は、使用不可になります。 これらの暗号化方式群は、特殊なアプリケーションで使用されます。返される配列には、Java Security Standard Algorithm Names Specificationの「JSSE暗号スイート名」セクションにある標準の暗号スイート名のリストからの暗号スイートが含まれ、プロバイダがサポートする他の暗号スイートが含まれる場合もあります。
- 戻り値:
- 暗号化方式群名の配列
- 関連項目:
-
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()このエンジンで現在使用可能になっているSSL暗号化方式群の名前を返します。 SSLエンジンが最初に作成されたときに、使用可能になっているすべての暗号化方式群で、最小限のサービス品質が保証されます。 環境によっては、この値は空の場合もあります。スイートが有効になっている場合でも、使用されないことがあります。 これは、ピアがそれをサポートしていないか、その使用が制限されているか、スイートに必要な証明書 (秘密キー)が使用できないか、または匿名スイートが有効になっているが認証が必要な場合に発生することがあります。
返される配列には、Java Security Standard Algorithm Names Specificationの「JSSE暗号スイート名」セクションにある標準の暗号スイート名のリストからの暗号スイートが含まれ、プロバイダがサポートする他の暗号スイートが含まれる場合もあります。
- 戻り値:
- 暗号化方式群名の配列
- 関連項目:
-
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites) このエンジンで使用可能な暗号化方式群を設定します。suitesパラメータ内の各暗号化方式群はgetSupportedCipherSuites()でリストされている必要があります。そうでない場合、このメソッドは失敗します。 このメソッドの呼出しが成功したあと、suitesパラメータに示されている暗号化方式群のみが使用可能になります。暗号スイート名の標準のリストは、JavaセキュリティStandardアルゴリズム名の仕様の「JSSE暗号スイート名」セクションにあります。 プロバイダは、このリストにない暗号スイート名をサポートするか、特定の暗号スイートに推奨名を使用しない場合があります。
特定の暗号スイートがエンジンで使用されない理由の詳細は、
getEnabledCipherSuites()を参照してください。- パラメータ:
suites- 有効にするすべての暗号化方式群の名前- スロー:
IllegalArgumentException- パラメータで指定された暗号化方式群の1つ以上がサポートされていないか、またはパラメータがnullである場合。- 関連項目:
-
getSupportedProtocols
public abstract String[] getSupportedProtocols()このSSLEngineで使用可能にできるプロトコルの名前を返します。- 戻り値:
- サポートされているプロトコルの配列
-
getEnabledProtocols
public abstract String[] getEnabledProtocols()このSSLEngineで現在使用可能になっているプロトコル・バージョンの名前を返します。プロトコルは、有効になっている場合でも、決して使用できません。 これは、ピアがプロトコルをサポートしていないか、その使用が制限されているか、またはプロトコルでサポートされている有効な暗号スイートがない場合に発生する可能性があります。
- 戻り値:
- プロトコルの配列
- 関連項目:
-
setEnabledProtocols
public abstract void setEnabledProtocols(String[] protocols) このエンジンで使用可能なプロトコルのバージョンを設定します。プロトコルは、getSupportedProtocols()により、サポート対象としてリストされていなければいけません。 このメソッドの呼出しが成功したあと、
protocolsパラメータに示されているプロトコルのみが使用可能になります。- パラメータ:
protocols- 有効にするすべてのプロトコルの名前。- スロー:
IllegalArgumentException- パラメータで指定されたプロトコルの1つ以上がサポートされていないか、またはprotocolsパラメータがnullである場合。- 関連項目:
-
getSession
public abstract SSLSession getSession()このSSLEngineで使用されているSSLSessionを返します。これらは存続期間が長くなる可能性があり、多くの場合、一部のユーザーのログイン・セッション全体に対応します。 セッションには、セッション内のすべての接続で使用される暗号化方式群と、セッションのクライアントとサーバーの識別情報が指定されています。
このメソッドは、
SSLSocket.getSession()とは異なり、ハンドシェークが完了するまでブロックされません。初期ハンドシェークが完了すると、無効な暗号化方式群SSL_NULL_WITH_NULL_NULLを報告するセッション・オブジェクトを返します。
- 戻り値:
- この
SSLEngineのSSLSession - 関連項目:
-
getHandshakeSession
public SSLSession getHandshakeSession()SSL/TLS/DTLSハンドシェイク中に構築されるSSLSessionを返します。TLS/DTLSプロトコルは、このクラスのインスタンスの使用時に必要なパラメータをネゴシエートできますが、
SSLSessionが完全に初期化され、getSessionを介して使用可能になる前です。 たとえば、有効なシグネチャ・アルゴリズムのリストでは、TrustManagerのディシジョン時に使用できる証明書のタイプを制限したり、ネットワーク環境をよりサポートするためにTLS/DTLSフラグメント・パケット・サイズの最大値をサイズ変更したりできます。このメソッドでは、構築されている
SSLSessionに早期にアクセスできます。 ハンドシェークの進捗状況によっては、一部のデータがまだ使用できない可能性があります。 たとえば、リモート・サーバーが証明書チェーンを送信しようとしているが、そのチェーンがまだ処理されていない場合、SSLSessionのgetPeerCertificatesメソッドはSSLPeerUnverifiedExceptionをスローします。 そのチェーンの処理が完了すると、getPeerCertificatesは適切な値を返します。- 戻り値:
- このインスタンスが現在ハンドシェークしていない場合、または現在のハンドシェークが基本的なSSLSessionを作成できる程十分に進捗していない場合はnull。 それ以外の場合、このメソッドは、現在ネゴシエーションが行われている
SSLSessionを返します。 - スロー:
UnsupportedOperationException- ベースとなるプロバイダがこの操作を実装していない場合。- 導入されたバージョン:
- 1.7
- 関連項目:
-
beginHandshake
public abstract void beginHandshake() throws SSLExceptionこのSSLEngineの初期ハンドシェークまたは再ネゴシエーションのハンドシェークを開始します。このメソッドは、初期ハンドシェーク時には必要ありません。ハンドシェークがまだ開始されていない場合は、
wrap()メソッドとunwrap()メソッドによって暗黙的にこのメソッドが呼び出されるからです。ピアも、適切なセッション再ネゴシエーションのハンドシェーク・メッセージを送信することにより、この
SSLEngineとのセッションの再ネゴシエーションを要求することがあります。このメソッドは、
SSLSocket#startHandshake()メソッドとは異なり、ハンドシェークが完了するまでブロックされません。完全なSSL/TLS/DTLSセッションの再ネゴシエーションを強制するには、このメソッドをコールする前に現在のセッションを無効にする必要があります。
既存のエンジン上で複数のハンドシェークをサポートせず、
SSLExceptionをスローするプロトコルもあります。- スロー:
SSLException-SSLEngineに新しくハンドシェークを開始するように通知しているとき、問題が発生した場合。 エンジンの終了の詳細は、クラスの説明を参照。IllegalStateException- クライアント/サーバー・モードがまだ設定されていない場合。- 関連項目:
-
getHandshakeStatus
public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()このSSLEngineの現在のハンドシェーク状態を返します。- 戻り値:
- 現在の
SSLEngineResult.HandshakeStatus。
-
setUseClientMode
public abstract void setUseClientMode(boolean mode) ハンドシェーク時、エンジンがクライアント(またはサーバー)モードを使用するように構成します。このメソッドは、すべてのハンドシェークの前に呼び出す必要があります。 いったんハンドシェークが開始されると、このエンジンの寿命が尽きるまで、現在のモードをリセットすることはできません。
通常、サーバーは自身を認証しますが、クライアントは必ずしもそうとはかぎりません。
- 実装上のノート:
- このモードのJDK SunJSSEプロバイダ実装のデフォルトはfalseです。
- パラメータ:
mode- ハンドシェークをクライアント・モードで開始する場合はtrue- スロー:
IllegalArgumentException- 最初のハンドシェークが開始されてからモードを変更しようとした場合。- 関連項目:
-
getUseClientMode
public abstract boolean getUseClientMode()ハンドシェーク時にクライアント・モードを使用するようにエンジンが設定されている場合はtrue。- 実装上のノート:
setUseClientMode(boolean)を使用してモードをtrueに変更しないかぎり、JDK SunJSSEプロバイダ実装はfalseを返します。- 戻り値:
- クライアント・モードでハンドシェークを行う場合は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()このSSLEngineで有効なSSLParametersを返します。 返されるSSLParametersの暗号化方式群とプロトコルは、常にnull以外です。- 戻り値:
- このSSLEngineで有効な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<SSLEngine, List<String>, String> selector) SSL/TLS/DTLSハンドシェイクのアプリケーション・プロトコル値を選択するコールバック関数を登録します。 この関数は、SSLParameters.setApplicationProtocolsを使用して指定された値をオーバーライドし、次の型パラメータをサポートします:
たとえば、次のコールは、TLSハンドシェイク・パラメータを調べ、アプリケーション・プロトコル名を選択するコールバック関数を登録します:-
SSLEngine - ファンクションの最初の引数では、ハンドシェイク・セッションおよび構成設定を含め、現在の
SSLEngineを検査できます。 -
List<String> - この関数の2番目の引数は、TLSピアによって通知されるアプリケーション・プロトコル名を一覧表示します。
-
String - ファンクションの結果は、アプリケーション・プロトコル名、または通知された名前はいずれも受け入れられないことを示すnullです。 戻り値が空の
Stringの場合、アプリケーション・プロトコル・インジケータは使用されません。 戻り値がnull (値が選択されていない)またはピアによって宣言されていない値である場合、基になるプロトコルは、実行するアクションを決定します。 (たとえば、ALPNは"no_application_protocol"アラートを送信し、接続を終了します。)
serverEngine.setHandshakeApplicationProtocolSelector( (serverEngine, clientProtocols) -> { SSLSession session = serverEngine.getHandshakeSession(); return chooseApplicationProtocol( serverEngine, clientProtocols, session.getProtocol(), session.getCipherSuite()); });- APIのノート:
- このメソッドは、TLSハンドシェイクを開始する前にTLSサーバー・アプリケーションによってコールする必要があります。 また、この
SSLEngineは、コールバック関数によって選択されたアプリケーション・プロトコルと互換性のあるパラメータで構成する必要があります。 たとえば、暗号スイートの選択が適切でないと、適切なアプリケーション・プロトコルがない可能性があります。SSLParametersを参照してください。 - 実装要件:
- このクラスの実装は、
UnsupportedOperationExceptionをスローし、他のアクションを実行しません。 - パラメータ:
selector- コールバック関数、またはコールバック機能を無効にする場合はnull。- スロー:
UnsupportedOperationException- ベースとなるプロバイダがこの操作を実装していない場合。- 導入されたバージョン:
- 9
-
-
getHandshakeApplicationProtocolSelector
public BiFunction<SSLEngine, List<String>, String> getHandshakeApplicationProtocolSelector()SSL/TLS/DTLSハンドシェイク中にアプリケーション・プロトコル値を選択するコールバック関数を取得します。 ファンクションの型パラメータについては、setHandshakeApplicationProtocolSelectorを参照してください。- 実装要件:
- このクラスの実装は、
UnsupportedOperationExceptionをスローし、他のアクションを実行しません。 - 戻り値:
- コールバック関数。設定されていない場合はnull。
- スロー:
UnsupportedOperationException- ベースとなるプロバイダがこの操作を実装していない場合。- 導入されたバージョン:
- 9
-