Класс SSLEngine

public abstract class SSLEngine
extends Object

Класс, который позволяет осуществлять защищенное общение с использованием таких протоколов, как Secure Sockets Layer (SSL), или протокол IETF RFC 2246 "Transport Layer Security" (TLS), но является независимым от транспорта.

Режимы защищенного обмена данными включают:

  • Защита целостности. SSL/TLS/DTLS защищают от изменения сообщений активным перехватом.
  • Аутентификация. В большинстве режимов SSL/TLS/DTLS обеспечивает аутентификацию участников. Серверы обычно аутентифицируются, а клиенты могут быть аутентифицированы по запросу сервера.
  • Конфиденциальность (защита конфиденциальности). В большинстве режимов SSL/TLS/DTLS шифрует данные, передаваемые между клиентом и сервером. Это защищает конфиденциальность данных, поэтому пассивные перехватывающие данные не увидят конфиденциальную информацию, такую как финансовые данные или личную информацию многих типов.
Эти типы защиты определяются «набором шифров», который представляет собой комбинацию криптографических алгоритмов, используемых заданным соединением SSL. Во время процесса переговоров два конечных узла должны договориться о наборе шифров, доступном в обеих средах. Если нет такого набора, общее соединение SSL не может быть установлено, и данные не могут быть обменены.

Используемый набор шифров устанавливается процессом переговоров, называемым «рукопожатием». Цель этого процесса — создать или повторно подключиться к «сессии», которая может защищать множество соединений со временем. После завершения рукопожатия вы можете получить доступ к атрибутам сессии, используя метод getSession().

Класс SSLSocket предоставляет большую часть той же функциональности безопасности, но все входные и выходные данные автоматически передаются с использованием базового Socket, который по дизайну использует блокирующий режим. Хотя это подходит для многих приложений, эта модель не предоставляет масштабируемость, необходимую для больших серверов.

Основное отличие SSLEngine заключается в том, что он работает с входными и выходными потоками байтов, независимо от механизма транспорта. Ответственность пользователя SSLEngine заключается в организации надежной транспортной системы ввода-вывода к партнёру. Разделив абстракцию SSL/TLS/DTLS от механизма транспортного ввода-вывода, SSLEngine может использоваться для самых разных типов ввода-вывода, таких как non-blocking I/O (polling), selectable non-blocking I/O, Socket и традиционные потоки ввода/вывода, локальные ByteBuffers или массивы байтов, будущие асинхронные модели ввода-вывода и т. д.

На высоком уровне SSLEngine выглядит следующим образом:

app data

                |           ^
                |     |     |
                v     |     |
           +----+-----|-----+----+
           |          |          |
           |       SSL|Engine    |
   wrap()  |          |          |  unwrap()
           | OUTBOUND | INBOUND  |
           |          |          |
           +----+-----|-----+----+
                |     |     ^
                |     |     |
                v           |

                   net data
Данные приложения (также известные как текстовые или нешифрованные данные) — это данные, которые производятся или потребляются приложением. Их аналогом являются сетевые данные, состоящие либо из данных рукопожатия и/или зашифрованных данных и предназначенные для передачи через механизм ввода-вывода. Входные данные — это данные, полученные от партнера, а выходные данные предназначены для партнера.

(В контексте SSLEngine, термин «данные рукопожатия» понимается как любые данные, обмениваемые для установления и управления защищенным соединением. Данные рукопожатия включают сообщения SSL/TLS/DTLS «alert», «change_cipher_spec» и «handshake».)

Существует пять различных фаз для SSLEngine.

  1. Создание — SSLEngine был создан и инициализирован, но еще не использовался. На этой стадии приложение может установить любые настройки, специфичные для SSLEngine (активные наборы шифров, необходимость SSLEngine выполнить рукопожатие в режиме клиента или сервера и т. д.). Однако, как только начнется рукопожатие, любые новые настройки (кроме режима клиента/сервера, см. ниже) будут использоваться для следующего рукопожатия.
  2. Первичное рукопожатие — начальное рукопожатие — это процедура, в ходе которой два партнера обмениваются параметрами связи до тех пор, пока не будет установлено SSLSession. Данные приложения не могут быть отправлены на этой стадии.
  3. Данные приложения — после того, как параметры связи были установлены, а рукопожатие завершено, данные приложения могут проходить через SSLEngine. Выходные сообщения приложения шифруются и защищаются от подмены, а входные сообщения выполняют обратный процесс.
  4. Повторное рукопожатие — любая сторона может запросить повторное согласование сеанса в любое время во время фазы Данные приложения. Новые данные рукопожатия могут быть смешаны среди данных приложения. Прежде чем начать фазу повторного рукопожатия, приложение может сбросить параметры связи SSL/TLS/DTLS, такие как список включенных наборов шифров и использование аутентификации клиента, но не может изменить между режимами клиент/сервер. Как и прежде, после начала рукопожатия любые новые настройки конфигурации SSLEngine не будут использоваться до следующего рукопожатия.
  5. Закрытие — когда соединение больше не требуется, приложения клиента и сервера должны закрыть обе стороны своих соединений. Для объектов SSLEngine приложение должно вызвать closeOutbound() и отправить любые оставшиеся сообщения партнеру. Аналогично, приложение должно принять все оставшиеся сообщения от партнера перед вызовом closeInbound(). После закрытия обеих сторон SSLEngine можно закрыть базовый механизм транспорта. Если соединение не закрыто должным образом (например, closeInbound() вызывается до получения уведомления о закрытии записи партнёра), будут подняты исключения, чтобы указать, что произошла ошибка. После закрытия движка он больше не может быть повторно использован: должен быть создан новый SSLEngine.
SSLEngine создается путем вызова SSLContext.createSSLEngine() из инициализированного SSLContext. Любые параметры конфигурации должны быть установлены до первого вызова wrap(), unwrap(), или beginHandshake(). Эти методы все запускают начальное рукопожатие.

Данные перемещаются через движок путем вызова wrap() или unwrap() для выходных или входных данных соответственно. В зависимости от состояния SSLEngine, вызов wrap() может использовать данные приложения из исходного буфера и может создавать сетевые данные в буфере назначения. Выходные данные могут содержать данные приложения и/или рукопожатия. Вызов unwrap() будет проверять исходный буфер и может продвинуть рукопожатие, если данные являются информацией о рукопожатии, или поместить данные приложения в буфер назначения, если данные представляют собой данные приложения. Состояние базового алгоритма SSL/TLS/DTLS определит, когда данные будут потребляться и производиться.

Вызовы wrap() и unwrap() возвращают SSLEngineResult, который указывает статус операции и (необязательно) как взаимодействовать с движком для достижения прогресса.

SSLEngine производит/потребляет только полные пакеты SSL/TLS/DTLS и не хранит данные приложения внутри между вызовами wrap()/unwrap(). Таким образом, входные и выходные буферы должны быть соответствующего размера для хранения максимального пакета. Вызовы 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()) {
   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;
   BUFFER_UNDERFLOW:
       int netSize = engine.getSession().getPacketBufferSize();
       // Resize buffer if needed.
       if (netSize > dst.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 могут потребовать результатов задач, которые могут занимать значительное время для завершения, или даже могут блокироваться. Например, менеджер доверия может потребовать подключения к удаленной службе проверки сертификатов, или менеджер ключей может потребовать запросить у пользователя, какой сертификат использовать в рамках аутентификации клиента. Кроме того, создание и проверка криптографических подписей может быть медленным, как будто это блокирует работу.

Для любой операции, которая потенциально может заблокировать выполнение, SSLEngine создаст делегированную задачу Runnable. Когда SSLEngineResult укажет, что результат делегированной задачи необходим, приложение должно вызвать getDelegatedTask() для получения ожидающей делегированной задачи и вызвать ее метод run() (возможно, используя другой поток в зависимости от стратегии вычисления). Приложение должно продолжать получать делегированные задачи до тех пор, пока они не закончатся, а затем повторить исходную операцию.

В конце сеанса связи приложения должны правильно закрыть соединение SSL/TLS/DTLS. Протоколы SSL/TLS/DTLS имеют сообщения рукопожатия закрытия, и эти сообщения должны быть переданы партнеру перед освобождением SSLEngine и закрытием базового механизма транспорта. Закрытие может быть инициировано одним из: SSLException, сообщением входного рукопожатия закрытия или одним из методов закрытия. Во всех случаях сообщения рукопожатия закрытия генерируются движком, и wrap() должно быть вызываться повторно до тех пор, пока статус полученного SSLEngineResult не вернет «CLOSED», или isOutboundDone() не вернет true. Все данные, полученные методом wrap(), должны быть отправлены партнеру.

closeOutbound() используется для сигнализации движку о том, что приложение больше не будет отправлять данные.

Узел будет сигнализировать о намерении закрыть соединение, отправив собственное сообщение о закрытии сеанса. После получения и обработки этого сообщения локальным SSLEngine в методе unwrap(), приложение может обнаружить закрытие, вызвав unwrap() и проверив наличие состояния SSLEngineResult со статусом "CLOSED", или если isInboundDone() возвращает true. Если по какой-либо причине узел закрывает канал связи без отправки соответствующего сообщения о закрытии SSL/TLS/DTLS, приложение может обнаружить конец потока и сообщить движку об отсутствии дальнейших входящих сообщений для обработки, вызвав closeInbound(). Некоторые приложения могут потребовать упорядоченных сообщений о закрытии от узла, в этом случае они могут проверить, было ли закрытие инициировано сообщением о рукопожатии, а не состоянием конца потока.

Существует две группы наборов шифрования, о которых вам необходимо знать при управлении наборами шифрования:

  • Поддерживаемые наборы шифрования: все наборы, которые поддерживаются реализацией SSL. Этот список предоставляется с помощью getSupportedCipherSuites().
  • Включенные наборы шифрования, которые могут быть меньше полного набора поддерживаемых наборов. Эта группа устанавливается с помощью метода setEnabledCipherSuites(String []) и запрашивается с помощью метода getEnabledCipherSuites(). Изначально для нового движка будет включен набор по умолчанию, представляющий минимальную рекомендуемую конфигурацию.
Параметры по умолчанию требуют, чтобы по умолчанию были включены только наборы шифрования, обеспечивающие аутентификацию серверов и конфиденциальность. Только если обе стороны явно соглашаются на неаутентифицированные и/или неконфиденциальные (незашифрованные) коммуникации, такой набор шифрования будет выбран.

Каждый SSL/TLS/DTLS-соединение должен иметь одного клиента и одного сервера, следовательно, каждый конечная точка должна выбрать роль. Этот выбор определяет, кто начинает процесс рукопожатия, а также какие типы сообщений должны быть отправлены каждой стороной. Метод setUseClientMode(boolean) настраивает режим. Обратите внимание, что режим по умолчанию для нового SSLEngine зависит от поставщика. Приложения должны явно задать режим перед вызовом других методов SSLEngine. После начала начального рукопожатия SSLEngine не может переключаться между режимами клиента и сервера, даже при выполнении повторных рукопожатий.

Приложения могут выбрать обработку делегированных задач в разных потоках. При создании SSLEngine сохраняется текущий AccessControlContext. Все последующие делегированные задачи будут обрабатываться с использованием этого контекста: то есть все решения по контролю доступа будут приниматься с использованием контекста, захваченного при создании движка.

Примечания по одновременности: необходимо учитывать две проблемы с одновременностью:
  1. Методы wrap() и unwrap() могут выполняться одновременно.
  2. Протоколы SSL/TLS/DTLS используют упорядоченные пакеты. Приложения должны позаботиться о том, чтобы генерируемые пакеты доставлялись последовательно. Если пакеты приходят в неправильном порядке, могут возникнуть непредвиденные или фатальные результаты.

    Например:

    synchronized (outboundLock) {
                      sslEngine.wrap(src, dst);
                      outboundQueue.put(dst);
                  }
    В качестве следствия, два потока не должны пытаться вызвать один и тот же метод (либо wrap() или unwrap()) одновременно, поскольку нет способа гарантировать конечную последовательность пакетов.
С:
1.5
См. также:
SSLContext, SSLSocket, SSLServerSocket, SSLSession, Socket

Конструкторы

Модификатор Конструктор Описание
protected SSLEngine()

Конструктор для SSLEngine, не предоставляющий подсказок для внутренней стратегии повторного использования сеанса.

protected SSLEngine​(String peerHost, int peerPort)

Конструктор для SSLEngine.

Методы

Модификатор и тип Метод Описание
abstract void beginHandshake()

Инициализирует рукопожатие (начальное или повторное) для этого SSLEngine.

abstract void closeInbound()

Сигнализирует, что больше нет входных сетевых данных, которые будут отправлены в этот SSLEngine.

abstract void closeOutbound()

Сигнализирует, что больше нет исходящих данных приложения, которые будут отправлены по этому SSLEngine.

String getApplicationProtocol()

Возвращает последнее значение протокола приложения, согласованное для этого соединения.

abstract Runnable getDelegatedTask()

Возвращает делегированную задачу Runnable для этого SSLEngine.

abstract String[] getEnabledCipherSuites()

Возвращает имена наборов шифров SSL, которые в настоящее время включены для использования на этом движке.

abstract String[] getEnabledProtocols()

Возвращает имена версий протоколов, которые в настоящее время включены для использования с этим SSLEngine.

abstract boolean getEnableSessionCreation()

Возвращает true, если новые сессии SSL могут быть созданы этим движком.

String getHandshakeApplicationProtocol()

Возвращает значение протокола приложения, согласованное в процессе текущего рукопожатия SSL/TLS.

BiFunction<SSLEngine,​List<String>,​String> getHandshakeApplicationProtocolSelector()

Получает функцию обратного вызова, которая выбирает значение протокола приложения во время рукопожатия SSL/TLS/DTLS.

SSLSession getHandshakeSession()

Возвращает SSLSession, создаваемый во время рукопожатия SSL/TLS/DTLS.

abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()

Возвращает текущий статус рукопожатия для этого SSLEngine.

abstract boolean getNeedClientAuth()

Возвращает true, если движок будет требовать аутентификации клиента.

String getPeerHost()

Возвращает имя хоста удаленного узла.

int getPeerPort()

Возвращает номер порта удаленного узла.

abstract SSLSession getSession()

Возвращает SSLSession, используемый в этом SSLEngine.

SSLParameters getSSLParameters()

Возвращает SSLParameters, действующие для этого SSLEngine.

abstract String[] getSupportedCipherSuites()

Возвращает имена наборов шифров, которые могут быть включены для использования на этом движке.

abstract String[] getSupportedProtocols()

Возвращает имена протоколов, которые могут быть включены для использования с этим SSLEngine.

abstract boolean getUseClientMode()

Возвращает true, если движок настроен на использование клиентского режима во время рукопожатия.

abstract boolean getWantClientAuth()

Возвращает true, если движок будет запрашивать аутентификацию клиента.

abstract boolean isInboundDone()

Возвращает, будет ли unwrap(ByteBuffer, ByteBuffer) принимать дополнительные сообщения с входными данными.

abstract boolean isOutboundDone()

Возвращает, будет ли wrap(ByteBuffer, ByteBuffer) генерировать дополнительные сообщения с исходящими данными.

abstract void setEnabledCipherSuites​(String[] suites)

Устанавливает наборы шифров, разрешенные для использования на этом движке.

abstract void setEnabledProtocols​(String[] protocols)

Устанавливает версии протоколов, разрешенные для использования на этом движке.

abstract void setEnableSessionCreation​(boolean flag)

Управляет возможностью создания новых сессий SSL этим движком.

void setHandshakeApplicationProtocolSelector​(BiFunction<SSLEngine,​List<String>,​String> selector)

Регистрирует функцию обратного вызова, которая выбирает значение протокола приложения для рукопожатия SSL/TLS/DTLS.

abstract void setNeedClientAuth​(boolean need)

Настраивает движок на требование аутентификации клиента.

void setSSLParameters​(SSLParameters params)

Применяет SSLParameters к этому движку.

abstract void setUseClientMode​(boolean mode)

Настраивает движок на использование клиентского (или серверного) режима во время рукопожатия.

abstract void setWantClientAuth​(boolean want)

Настраивает движок на запрос аутентификации клиента.

SSLEngineResult unwrap​(ByteBuffer src, ByteBuffer dst)

Попытка декодирования сетевых данных SSL/TLS/DTLS в буфер данных приложения в формате обычного текста.

SSLEngineResult unwrap​(ByteBuffer src, ByteBuffer[] dsts)

Попытка декодирования сетевых данных SSL/TLS/DTLS в последовательность буферов данных приложения в формате обычного текста.

abstract SSLEngineResult unwrap​(ByteBuffer src, ByteBuffer[] dsts, int offset, int length)

Попытка декодирования сетевых данных SSL/TLS/DTLS в подпоследовательность буферов данных приложения в формате обычного текста.

abstract SSLEngineResult wrap​(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst)

Попытка кодирования байтов обычного текста из подпоследовательности буферов данных в сетевые данные SSL/TLS/DTLS.

SSLEngineResult wrap​(ByteBuffer[] srcs, ByteBuffer dst)

Попытка кодирования байтов обычного текста из последовательности буферов данных в сетевые данные SSL/TLS/DTLS.

SSLEngineResult wrap​(ByteBuffer src, ByteBuffer dst)

Попытка кодирования буфера данных приложения в формате обычного текста в сетевые данные SSL/TLS/DTLS.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Конструкторы

SSLEngine

protected SSLEngine()

Конструктор для SSLEngine без указания стратегии повторного использования внутренней сессии.

См. также:
SSLContext.createSSLEngine(), SSLSessionContext

SSLEngine

protected SSLEngine(String peerHost,
                    int peerPort)

Конструктор для SSLEngine.

Реализации SSLEngine могут использовать параметры peerHost и peerPort как подсказки для своей внутренней стратегии повторного использования сессий.

Некоторые наборы шифров (например, Kerberos) требуют информацию о удалённом имени хоста. Реализации данного класса должны использовать этот конструктор для использования Kerberos.

Параметры не проверяются на подлинность SSLEngine.

Параметры:
peerHost - имя хоста удалённого узла
peerPort - номер порта удалённого узла
См. также:
SSLContext.createSSLEngine(String, int), SSLSessionContext

Методы

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 - буфер с данными приложения в формате открытого текста
dst - буфер для хранения сетевых данных в формате открытого текста
Возвращает:
объект, описывающий результат операции.
Исключения:
SSLException - Произошла проблема во время обработки данных, которая привела к завершению SSLEngine. См. описание класса для получения дополнительной информации о закрытии двигателя.
ReadOnlyBufferException - если буфер dst является только для чтения.
IllegalArgumentException - если src или dst равны null.
IllegalStateException - если режим клиент/сервер еще не задан.
См. также:
wrap(ByteBuffer [], int, int, ByteBuffer)

wrap

public SSLEngineResult wrap(ByteBuffer[] srcs,
                            ByteBuffer dst)
                     throws SSLException

Попытка закодировать байты данных приложения из последовательности буферов в сетевые данные SSL/TLS/DTLS.

Вызов этого метода ведет себя точно так же, как вызов:

engine.wrap(srcs, 0, srcs.length, dst);
Параметры:
srcs - массив буферов с данными приложения в формате открытого текста
dst - буфер для хранения сетевых данных в формате открытого текста
Возвращает:
объект, описывающий результат операции.
Исключения:
SSLException - Произошла проблема во время обработки данных, которая привела к завершению SSLEngine. См. описание класса для получения дополнительной информации о закрытии двигателя.
ReadOnlyBufferException - если буфер dst является только для чтения.
IllegalArgumentException - если srcs или dst равны null, или если какой-либо элемент в srcs равен null.
IllegalStateException - если режим клиент/сервер еще не задан.
См. также:
wrap(ByteBuffer [], int, int, ByteBuffer)

wrap

public abstract SSLEngineResult wrap(ByteBuffer[] srcs,
                                     int offset,
                                     int length,
                                     ByteBuffer dst)
                              throws SSLException

Попытка закодировать байты данных приложения из подпоследовательности буферов в сетевые данные SSL/TLS/DTLS. Эта операция "сбора" кодирует в одном вызове последовательность байтов из одной или нескольких заданных последовательностей буферов. Операции сбора часто полезны при реализации сетевых протоколов или форматов файлов, которые, например, группируют данные в сегменты, состоящие из одного или нескольких заголовков фиксированной длины, за которыми следует тело переменной длины. См. GatheringByteChannel для получения дополнительной информации о сборе и GatheringByteChannel.write(ByteBuffer[], int, int) для получения дополнительной информации о поведении подпоследовательности.

В зависимости от состояния SSLEngine, этот метод может генерировать сетевые данные без потребления каких-либо данных приложения (например, он может генерировать данные рукопожатия).

Приложение отвечает за надёжную передачу сетевых данных удалённому узлу и за обеспечение того, что данные, созданные с помощью нескольких вызовов wrap(), передаются в том же порядке, в котором они были сгенерированы. Приложение должно правильно синхронизировать несколько вызовов этого метода.

Если этот SSLEngine ещё не начал своё начальное рукопожатие, этот метод автоматически начнёт рукопожатие.

Этот метод попытается сгенерировать записи SSL/TLS/DTLS и потребляет как можно больше исходных данных, но никогда не потребляет больше, чем сумма байтов, оставшихся в каждом буфере. Позиция каждого буфера ByteBuffer обновляется для отражения количества потребленных или произведённых данных. Пределы остаются теми же.

Основная память, используемая буферами srcs и dst ByteBuffer, не должна быть одинаковой.

См. описание класса для получения дополнительной информации о закрытии двигателя.

Параметры:
srcs - массив буферов с данными приложения в формате открытого текста
offset - Смещение в массиве буферов первого буфера, из которого будут извлечены байты; оно должно быть неотрицательным и не больше srcs.length
length - Максимальное количество буферов для доступа; оно должно быть неотрицательным и не больше srcs.length - offset
dst - буфер для хранения сетевых данных в формате открытого текста
Возвращает:
объект, описывающий результат операции.
Исключения:
SSLException - Произошла проблема во время обработки данных, которая привела к завершению SSLEngine. См. описание класса для получения дополнительной информации о закрытии двигателя.
IndexOutOfBoundsException - если условия для параметров offset и length не соблюдаются.
ReadOnlyBufferException - если буфер dst является только для чтения.
IllegalArgumentException - если srcs или dst равны null, или если какой-либо элемент в указанной подпоследовательности srcs равен null.
IllegalStateException - если режим клиент/сервер еще не задан.
См. также:
GatheringByteChannel, GatheringByteChannel.write( ByteBuffer[], int, int)

unwrap

public SSLEngineResult unwrap(ByteBuffer src,
                              ByteBuffer dst)
                       throws SSLException

Попытка декодировать сетевые данные SSL/TLS/DTLS в буфер с данными приложения в формате открытого текста.

Вызов этого метода ведет себя точно так же, как вызов:

engine.unwrap(src, new ByteBuffer [] { dst }, 0, 1);
Параметры:
src - буфер с входящими сетевыми данными.
dst - буфер для хранения входящих данных приложения.
Возвращает:
объект, описывающий результат операции.
Исключения:
SSLException - Произошла проблема во время обработки данных, которая привела к завершению SSLEngine. См. описание класса для получения дополнительной информации о закрытии двигателя.
ReadOnlyBufferException - если буфер dst является только для чтения.
IllegalArgumentException - если src или dst равны null.
IllegalStateException - если режим клиент/сервер еще не задан.
См. также:
unwrap(ByteBuffer, ByteBuffer [], int, int)

unwrap

public SSLEngineResult unwrap(ByteBuffer src,
                              ByteBuffer[] dsts)
                       throws SSLException

Попытка декодировать сетевые данные SSL/TLS/DTLS в последовательность буферов с данными приложения в формате открытого текста.

Вызов этого метода ведет себя точно так же, как вызов:

engine.unwrap(src, dsts, 0, dsts.length);
Параметры:
src - буфер с входящими сетевыми данными.
dsts - массив буферов для хранения входящих данных приложения.
Возвращает:
объект, описывающий результат операции.
Исключения:
SSLException - Произошла проблема во время обработки данных, которая привела к завершению SSLEngine. См. описание класса для получения дополнительной информации о закрытии двигателя.
ReadOnlyBufferException - если любой из буферов dst является только для чтения.
IllegalArgumentException - если src или dsts равны null, или если какой-либо элемент в dsts равен null.
IllegalStateException - если режим клиент/сервер еще не задан.
См. также:
unwrap(ByteBuffer, ByteBuffer [], int, int)

unwrap

public abstract SSLEngineResult unwrap(ByteBuffer src,
                                       ByteBuffer[] dsts,
                                       int offset,
                                       int length)
                                throws SSLException

Попытки декодировать данные сети SSL/TLS/DTLS в подпоследовательность буферов данных приложения в формате простого текста. Эта операция «рассеивания» декодирует последовательность байтов в один или несколько буферов заданной последовательности в одном вызове. Рассеивающие разворачивания часто полезны при реализации сетевых протоколов или форматов файлов, которые, например, группируют данные в сегменты, состоящие из одного или нескольких заголовков фиксированной длины, за которыми следует тело переменной длины. См. ScatteringByteChannel для получения дополнительной информации о рассеивании и ScatteringByteChannel.read(ByteBuffer[], int, int) для получения дополнительной информации о поведении подпоследовательности.

В зависимости от состояния SSLEngine этот метод может потреблять данные сети без производства каких-либо данных приложения (например, он может потреблять данные рукопожатия).

Приложение отвечает за надежное получение данных сети от узла и за вызов unwrap() для данных в порядке их получения. Приложение должно правильно синхронизировать несколько вызовов этого метода.

Если это SSLEngine еще не начало свой начальный обмен рукопожатиями, этот метод автоматически начнет обмен рукопожатиями.

Этот метод попытается прочитать один полный сетевой пакет SSL/TLS/DTLS, но никогда не прочитает больше, чем сумму оставшихся байтов в буферах. Позиция каждого ByteBuffer обновляется, чтобы отразить объем потребленных или произведенных данных. Пределы остаются неизменными.

Базовая память, используемая src и dsts ByteBuffers, не должна быть одинаковой.

Входящий сетевой буфер может быть изменён в результате этого вызова: поэтому, если сетевой пакет данных необходим для какой-либо дополнительной цели, данные должны быть дублированы перед вызовом этого метода. Примечание: сетевые данные не будут полезны для другого SSLEngine, так как каждый SSLEngine содержит уникальное случайное состояние, которое влияет на сообщения SSL/TLS/DTLS.

См. описание класса для получения дополнительной информации о закрытии двигателя.

Параметры:
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 - если режим клиента/сервера еще не задан.
См. также:
ScatteringByteChannel, ScatteringByteChannel.read( ByteBuffer[], int, int)

getDelegatedTask

public abstract Runnable getDelegatedTask()

Возвращает делегированную задачу Runnable для этого SSLEngine.

Операции SSLEngine могут потребовать результатов операций блокировки или могут занимать значительное время для завершения. Этот метод используется для получения открытой операции Runnable (задачи). Каждая задача должна быть назначена потоку (возможно, текущему) для выполнения операции run. После того как метод run вернёт результат, объект Runnable больше не нужен и может быть удалён.

Делегированные задачи выполняются в AccessControlContext в том же месте, где был создан этот объект.

Вызов этого метода вернёт каждую открытую задачу ровно один раз.

Несколько делегированных задач могут выполняться параллельно.

Возвращает:
делегированная задача Runnable, или null, если они отсутствуют.

closeInbound

public abstract void closeInbound()
                           throws SSLException

Указывает, что больше входящих сетевых данных не будут отправляться в этот SSLEngine.

Если приложение инициировало процесс закрытия, вызвав closeOutbound(), в некоторых случаях инициатору не нужно ждать соответствующего сообщения о закрытии от узла. (См. раздел 7.2.1 спецификации TLS (RFC 2246) для получения дополнительной информации о ожидании предупреждений о закрытии.) В таких случаях вызов этого метода необязателен.

Но если приложение не инициировало процесс закрытия или если вышеуказанные обстоятельства не применяются, этот метод должен вызываться всякий раз, когда достигается конец потока данных SSL/TLS/DTLS. Это гарантирует закрытие входящей стороны и проверяет, что узел правильно выполнил процедуру закрытия SSL/TLS/DTLS, обнаруживая возможные атаки обрезания.

Этот метод идемпотентен: если входящая сторона уже закрыта, этот метод ничего не делает.

Следует вызвать wrap() для очистки любых оставшихся данных рукопожатия.

Исключения:
SSLException - если этот движок не получил надлежащего сообщения о закрытии SSL/TLS/DTLS от узла.
См. также:
isInboundDone(), isOutboundDone()

isInboundDone

public abstract boolean isInboundDone()

Возвращает, будет ли unwrap(ByteBuffer, ByteBuffer) принимать дополнительные входящие сообщения данных.

Возвращает:
true, если SSLEngine не будет потреблять больше сетевых данных (и, следовательно, не будет производить больше данных приложения).
См. также:
closeInbound()

closeOutbound

public abstract void closeOutbound()

Указывает, что больше исходящих данных приложения не будут отправляться на этот SSLEngine.

Этот метод идемпотентен: если исходящая сторона уже закрыта, этот метод ничего не делает.

Следует вызвать wrap(ByteBuffer, ByteBuffer) для очистки любых оставшихся данных рукопожатия.

См. также:
isOutboundDone()

isOutboundDone

public abstract boolean isOutboundDone()

Возвращает, будет ли wrap(ByteBuffer, ByteBuffer) производить больше исходящих сообщений данных.

Обратите внимание, что во время фазы закрытия SSLEngine может генерировать данные рукопожатия закрытия, которые должны быть отправлены узлу. wrap() необходимо вызвать для генерации этих данных. Когда этот метод возвращает true, больше исходящих данных не будет создано.

Возвращает:
true, если SSLEngine не будет производить больше сетевых данных.
См. также:
closeOutbound(), closeInbound()

getSupportedCipherSuites

public abstract String[] getSupportedCipherSuites()

Возвращает имена наборов шифрования, которые могут быть включены для использования в этом движке. Обычно только подмножество из них будет фактически включено по умолчанию, поскольку этот список может включать наборы шифрования, которые не соответствуют требованиям качества обслуживания для этих значений по умолчанию. Такие наборы шифрования могут быть полезны в специализированных приложениях.

Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе «Имена наборов шифрования JSSE» документации Java Cryptography Architecture Standard Algorithm Name, а также может включать другие наборы шифрования, которые поддерживает поставщик.

Возвращает:
массив имён наборов шифрования
См. также:
getEnabledCipherSuites(), setEnabledCipherSuites(String [])

getEnabledCipherSuites

public abstract String[] getEnabledCipherSuites()

Возвращает имена наборов шифрования SSL, которые в настоящее время включены для использования в этом движке. При первом создании SSLEngine все включенные наборы шифрования поддерживают минимальное качество обслуживания. Таким образом, в некоторых средах это значение может быть пустым.

Обратите внимание, что даже если набор включён, он может никогда не использоваться. Это может произойти, если узел его не поддерживает, или его использование ограничено, или необходимые сертификаты (и закрытые ключи) для набора недоступны, или анонимный набор включён, но необходима аутентификация.

Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе «Имена наборов шифрования JSSE» документации Java Cryptography Architecture Standard Algorithm Name, а также может включать другие наборы шифрования, которые поддерживает поставщик.

Возвращает:
массив имён наборов шифрования
См. также:
getSupportedCipherSuites(), setEnabledCipherSuites(String [])

setEnabledCipherSuites

public abstract void setEnabledCipherSuites(String[] suites)

Устанавливает наборы шифрования, разрешённые для использования в этом движке.

Каждый набор шифрования в параметре suites должен был быть перечислен методом getSupportedCipherSuites(), в противном случае метод завершится ошибкой. После успешного вызова этого метода, для использования будут разрешены только наборы, перечисленные в параметре suites.

Обратите внимание, что стандартный список имён наборов шифрования можно найти в разделе Имена наборов шифрования JSSE в документации Java Cryptography Architecture Standard Algorithm Name. Поставщики могут поддерживать имена наборов шифрования, отсутствующие в этом списке, или могут не использовать рекомендуемое имя для определённого набора шифрования.

См. getEnabledCipherSuites() для получения дополнительной информации о том, почему определённый набор шифрования может никогда не использоваться в движке.

Параметры:
suites - Имена всех наборов шифрования для включения
Исключения:
IllegalArgumentException - если один или несколько шифров, указанных в параметре, не поддерживаются, или если параметр равен null.
См. также:
getSupportedCipherSuites(), getEnabledCipherSuites()

getSupportedProtocols

public abstract String[] getSupportedProtocols()

Возвращает имена протоколов, которые могут быть включены для использования с этим SSLEngine.

Возвращает:
массив поддерживаемых протоколов

getEnabledProtocols

public abstract String[] getEnabledProtocols()

Возвращает имена версий протоколов, которые в настоящее время включены для использования с этим SSLEngine.

Обратите внимание, что даже если протокол включён, он может никогда не использоваться. Это может произойти, если у пары нет поддержки данного протокола, его использование ограничено, или нет включённых наборов шифрования, поддерживаемых данным протоколом.

Возвращает:
массив протоколов
См. также:
setEnabledProtocols(String [])

setEnabledProtocols

public abstract void setEnabledProtocols(String[] protocols)

Устанавливает версии протоколов, разрешённые для использования в этом движке.

Протоколы должны быть перечислены методом getSupportedProtocols() как поддерживаемые. После успешного вызова этого метода, для использования будут разрешены только протоколы, перечисленные в параметре protocols.

Параметры:
protocols - Имена всех протоколов для включения.
Исключения:
IllegalArgumentException - если один или несколько протоколов, указанных в параметре, не поддерживаются, или если параметр protocols равен null.
См. также:
getEnabledProtocols()

getSession

public abstract SSLSession getSession()

Возвращает SSLSession , используемый в этом SSLEngine.

Они могут быть долгоживущими и часто соответствуют всей сессии входа в систему для определённого пользователя. Сессия указывает конкретный набор шифрования, который активно используется всеми подключениями в этой сессии, а также идентичности клиента и сервера сессии.

В отличие от SSLSocket.getSession(), этот метод не блокируется до завершения рукопожатия.

До завершения первоначального рукопожатия этот метод возвращает объект сессии, который сообщает о недействительном наборе шифрования "SSL_NULL_WITH_NULL_NULL".

Возвращает:
SSLSession для этого SSLEngine
См. также:
SSLSession

getHandshakeSession

public SSLSession getHandshakeSession()

Возвращает SSLSession, формируемый во время рукопожатия SSL/TLS/DTLS.

Протоколы TLS/DTLS могут согласовывать параметры, необходимые при использовании экземпляра этого класса, но до того, как SSLSession будет полностью инициализирован и доступен через getSession. Например, список допустимых алгоритмов подписи может ограничивать тип сертификатов, которые могут использоваться при принятии решений TrustManager, или максимальные размеры фрагментов пакетов TLS/DTLS могут быть изменены для лучшей поддержки сетевой среды.

Этот метод предоставляет ранний доступ к формируемому SSLSession. В зависимости от того, насколько продвинулось рукопожатие, некоторые данные могут пока быть недоступны для использования. Например, если удалённый сервер будет отправлять цепочку сертификатов, но эта цепочка ещё не обработана, метод getPeerCertificates класса SSLSession выбросит исключение SSLPeerUnverifiedException. После обработки этой цепочки, getPeerCertificates вернёт правильное значение.

Возвращает:
null, если данный экземпляр не находится в процессе рукопожатия или если текущее рукопожатие не продвинулось достаточно далеко, чтобы создать базовый SSLSession. В противном случае этот метод возвращает SSLSession, который в настоящее время согласовывается.
Исключения:
UnsupportedOperationException - если базовый поставщик не реализует операцию.
С:
1.7
См. также:
SSLSocket, SSLSession, ExtendedSSLSession, X509ExtendedKeyManager, X509ExtendedTrustManager

beginHandshake

public abstract void beginHandshake()
                             throws SSLException

Инициализирует рукопожатие (начальное или повторное) для этого SSLEngine.

Этот метод не нужен для начального рукопожатия, так как методы wrap() и unwrap() неявно вызовут этот метод, если рукопожатие ещё не началось.

Обратите внимание, что пара также может запросить повторное согласование сессии с этим SSLEngine, отправив соответствующее сообщение рукопожатия повторного согласования сессии.

В отличие от метода SSLSocket#startHandshake(), этот метод не блокируется до завершения рукопожатия.

Чтобы принудительно выполнить полное повторное согласование сессии SSL/TLS/DTLS, необходимо предварительно аннулировать текущую сессию перед вызовом этого метода.

Некоторые протоколы могут не поддерживать несколько рукопожатий в существующем движке и могут выбросить SSLException.

Исключения:
SSLException - если при передаче сигнала SSLEngine для начала нового рукопожатия возникла проблема. См. описание класса для получения дополнительной информации о закрытии движка.
IllegalStateException - если режим клиента/сервера ещё не задан.
См. также:
SSLSession.invalidate()

getHandshakeStatus

public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()

Возвращает текущий статус рукопожатия для этого SSLEngine.

Возвращает:
текущий SSLEngineResult.HandshakeStatus.

setUseClientMode

public abstract void setUseClientMode(boolean mode)

Настраивает движок на использование режима клиента (или сервера) при рукопожатии.

Этот метод должен быть вызван до любого рукопожатия. После начала рукопожатия режим не может быть изменён на протяжении всего существования этого движка.

Серверы обычно авторизуют себя, а клиенты не обязаны этого делать.

Примечание реализации:
Значение по умолчанию для этого режима в реализации JDK SunJSSE поставщика равно false.
Параметры:
mode - true, если движок должен начать рукопожатие в режиме "клиента"
Исключения:
IllegalArgumentException - если попытка изменения режима выполняется после начала первоначального рукопожатия.
См. также:
getUseClientMode()

getUseClientMode

public abstract boolean getUseClientMode()

Возвращает true, если движок настроен на использование режима клиента при рукопожатии.

Примечание реализации:
Реализация JDK SunJSSE поставщика возвращает false, если не используется setUseClientMode(boolean) для изменения режима на true.
Возвращает:
true, если движок должен выполнять рукопожатие в режиме "клиента"
См. также:
setUseClientMode(boolean)

setNeedClientAuth

public abstract void setNeedClientAuth(boolean need)

Настраивает движок на требование проверки подлинности клиента. Этот параметр полезен только для движков в режиме сервера.

Настройка проверки подлинности клиента движка может быть одной из следующих:

  • требуется проверка подлинности клиента
  • запрашивается проверка подлинности клиента
  • проверка подлинности клиента не требуется

В отличие от setWantClientAuth(boolean), если этот параметр установлен, и клиент выбирает не предоставить информацию о проверке подлинности, согласование прекращается, и движок начнёт процедуру закрытия.

Вызов этого метода переопределяет все предыдущие настройки, сделанные этим методом или setWantClientAuth(boolean).

Параметры:
need - устанавливается в true, если требуется проверка подлинности клиента, или в false, если проверка подлинности клиента не требуется.
См. также:
getNeedClientAuth(), setWantClientAuth(boolean), getWantClientAuth(), setUseClientMode(boolean)

getNeedClientAuth

public abstract boolean getNeedClientAuth()

Возвращает true, если движок требует проверки подлинности клиента. Этот параметр полезен только для движков в режиме сервера.

Возвращает:
true, если проверка подлинности клиента требуется, или false, если проверка подлинности клиента не требуется.
См. также:
setNeedClientAuth(boolean), setWantClientAuth(boolean), getWantClientAuth(), setUseClientMode(boolean)

setWantClientAuth

public abstract void setWantClientAuth(boolean want)

Настраивает движок на запрос проверки подлинности клиента. Этот параметр полезен только для движков в режиме сервера.

Настройка проверки подлинности клиента движка может быть одной из следующих:

  • требуется проверка подлинности клиента
  • запрашивается проверка подлинности клиента
  • проверка подлинности клиента не требуется

В отличие от setNeedClientAuth(boolean), если этот параметр установлен, и клиент выбирает не предоставить информацию о проверке подлинности, согласование продолжится.

Вызов этого метода переопределяет все предыдущие настройки, сделанные этим методом или setNeedClientAuth(boolean).

Параметры:
want - установить в значение true, если требуется аутентификация клиента, или false, если аутентификация клиента не требуется.
См. также:
getWantClientAuth(), setNeedClientAuth(boolean), getNeedClientAuth(), setUseClientMode(boolean)

getWantClientAuth

public abstract boolean getWantClientAuth()

Возвращает true, если движок запросит аутентификацию клиента. Этот параметр полезен только для движков в режиме сервера.

Возвращаемое значение:
true, если требуется аутентификация клиента, или false, если она не требуется.
См. также:
setNeedClientAuth(boolean), getNeedClientAuth(), setWantClientAuth(boolean), setUseClientMode(boolean)

setEnableSessionCreation

public abstract void setEnableSessionCreation(boolean flag)

Управляет возможностью создания новых сеансов SSL этим движком. Если создание сеансов запрещено, и нет существующих сеансов для возобновления, рукопожатие не будет успешным.

Параметры:
flag - true указывает, что создание сеансов разрешено; это значение по умолчанию. false указывает, что необходимо возобновить существующий сеанс
См. также:
getEnableSessionCreation()

getEnableSessionCreation

public abstract boolean getEnableSessionCreation()

Возвращает true, если этим движком могут быть созданы новые сеансы SSL.

Возвращаемое значение:
true указывает, что создание сеансов разрешено; это значение по умолчанию. false указывает, что необходимо возобновить существующий сеанс
См. также:
setEnableSessionCreation(boolean)

getSSLParameters

public SSLParameters getSSLParameters()

Возвращает параметры SSL, действующие для этого SSLEngine. Наборы шифров и протоколов возвращаемых SSLParameters всегда не null.

Возвращаемое значение:
параметры SSL, действующие для этого SSLEngine.
С момента:
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 , Application-Layer Protocol Negotiation (ALPN), могут согласовывать значения на уровне приложения между peer'ами.

Требования к реализации:
Реализация в этом классе выбрасывает UnsupportedOperationException и не выполняет никаких других действий.
Возвращаемое значение:
null, если еще не определено, могут ли использоваться протоколы приложений для этого соединения; пустую строку, если протоколы приложений не будут использоваться; или непустой протокол приложения, если значение было успешно согласовано.
Исключения:
UnsupportedOperationException - если базовая система не реализует операцию.
С момента:
9

getHandshakeApplicationProtocol

public String getHandshakeApplicationProtocol()

Возвращает значение протокола приложения, согласованное во время рукопожатия SSL/TLS, которое в настоящее время происходит.

Как и getHandshakeSession(), соединение может быть на середине рукопожатия. Протокол приложения может или не может быть еще доступен.

Требования к реализации:
Реализация в этом классе выбрасывает UnsupportedOperationException и не выполняет никаких других действий.
Возвращаемое значение:
null, если еще не определено, могут ли использоваться протоколы приложений для этого рукопожатия; пустую строку, если протоколы приложений не будут использоваться; или непустой протокол приложения, если значение было успешно согласовано.
Исключения:
UnsupportedOperationException - если базовая система не реализует операцию.
С момента:
9

setHandshakeApplicationProtocolSelector

public void setHandshakeApplicationProtocolSelector(BiFunction<SSLEngine,​List<String>,​String> selector)

Регистрирует функцию обратного вызова, которая выбирает значение протокола приложения для рукопожатия SSL/TLS/DTLS. Функция переопределяет любые значения, предоставленные с помощью SSLParameters.setApplicationProtocols, и поддерживает следующие типы параметров:

SSLEngine
Первый аргумент функции позволяет проверить текущие SSLEngine , включая сеанс рукопожатия и параметры конфигурации.
List<String>
Второй аргумент функции перечисляет имена протоколов приложения, объявленные peer'ом TLS.
String
Результатом функции является имя протокола приложения или null, чтобы указать, что ни одно из объявленных имён не является приемлемым. Если возвращаемое значение является пустой строкой, то указания протокола приложения не будут использоваться. Если возвращаемое значение null (нет выбранного значения) или это значение, которое не было объявлено peer'ом, базовый протокол определит, какие действия предпринять. (Например, ALPN отправит предупреждение "no_application_protocol" и прекратит соединение.)
Например, следующий вызов регистрирует функцию обратного вызова, которая анализирует параметры рукопожатия TLS и выбирает имя протокола приложения:
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

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLEngine.html

Spec-Zone .ru
спецификации, руководства, описания, API