Класс SSLEngine
- java.lang.Object
-
- javax.net.ssl.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 шифрует данные, передаваемые между клиентом и сервером. Это защищает конфиденциальность данных, поэтому пассивные перехватывающие данные не увидят конфиденциальную информацию, такую как финансовые данные или личную информацию многих типов.
Используемый набор шифров устанавливается процессом переговоров, называемым «рукопожатием». Цель этого процесса — создать или повторно подключиться к «сессии», которая может защищать множество соединений со временем. После завершения рукопожатия вы можете получить доступ к атрибутам сессии, используя метод 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.
- Создание —
SSLEngineбыл создан и инициализирован, но еще не использовался. На этой стадии приложение может установить любые настройки, специфичные дляSSLEngine(активные наборы шифров, необходимостьSSLEngineвыполнить рукопожатие в режиме клиента или сервера и т. д.). Однако, как только начнется рукопожатие, любые новые настройки (кроме режима клиента/сервера, см. ниже) будут использоваться для следующего рукопожатия. - Первичное рукопожатие — начальное рукопожатие — это процедура, в ходе которой два партнера обмениваются параметрами связи до тех пор, пока не будет установлено SSLSession. Данные приложения не могут быть отправлены на этой стадии.
- Данные приложения — после того, как параметры связи были установлены, а рукопожатие завершено, данные приложения могут проходить через
SSLEngine. Выходные сообщения приложения шифруются и защищаются от подмены, а входные сообщения выполняют обратный процесс. - Повторное рукопожатие — любая сторона может запросить повторное согласование сеанса в любое время во время фазы Данные приложения. Новые данные рукопожатия могут быть смешаны среди данных приложения. Прежде чем начать фазу повторного рукопожатия, приложение может сбросить параметры связи SSL/TLS/DTLS, такие как список включенных наборов шифров и использование аутентификации клиента, но не может изменить между режимами клиент/сервер. Как и прежде, после начала рукопожатия любые новые настройки конфигурации
SSLEngineне будут использоваться до следующего рукопожатия. - Закрытие — когда соединение больше не требуется, приложения клиента и сервера должны закрыть обе стороны своих соединений. Для объектов
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. Все последующие делегированные задачи будут обрабатываться с использованием этого контекста: то есть все решения по контролю доступа будут приниматься с использованием контекста, захваченного при создании движка.
- Методы
wrap()иunwrap()могут выполняться одновременно. - Протоколы SSL/TLS/DTLS используют упорядоченные пакеты. Приложения должны позаботиться о том, чтобы генерируемые пакеты доставлялись последовательно. Если пакеты приходят в неправильном порядке, могут возникнуть непредвиденные или фатальные результаты.
Например:
synchronized (outboundLock) { sslEngine.wrap(src, dst); outboundQueue.put(dst); }В качестве следствия, два потока не должны пытаться вызвать один и тот же метод (либоwrap()илиunwrap()) одновременно, поскольку нет способа гарантировать конечную последовательность пакетов.
- С:
- 1.5
- См. также:
-
SSLContext,SSLSocket,SSLServerSocket,SSLSession,Socket
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | SSLEngine() | Конструктор для |
protected | SSLEngine(String peerHost,
int peerPort) | Конструктор для |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract void | beginHandshake() | Инициализирует рукопожатие (начальное или повторное) для этого SSLEngine. |
abstract void | closeInbound() | Сигнализирует, что больше нет входных сетевых данных, которые будут отправлены в этот |
abstract void | closeOutbound() | Сигнализирует, что больше нет исходящих данных приложения, которые будут отправлены по этому |
String | getApplicationProtocol() | Возвращает последнее значение протокола приложения, согласованное для этого соединения. |
abstract Runnable | getDelegatedTask() | Возвращает делегированную задачу |
abstract String[] | getEnabledCipherSuites() | Возвращает имена наборов шифров SSL, которые в настоящее время включены для использования на этом движке. |
abstract String[] | getEnabledProtocols() | Возвращает имена версий протоколов, которые в настоящее время включены для использования с этим |
abstract boolean | getEnableSessionCreation() | Возвращает true, если новые сессии SSL могут быть созданы этим движком. |
String | getHandshakeApplicationProtocol() | Возвращает значение протокола приложения, согласованное в процессе текущего рукопожатия SSL/TLS. |
BiFunction<SSLEngine,List<String>,String> | getHandshakeApplicationProtocolSelector() | Получает функцию обратного вызова, которая выбирает значение протокола приложения во время рукопожатия SSL/TLS/DTLS. |
SSLSession | getHandshakeSession() | Возвращает |
abstract SSLEngineResult.HandshakeStatus | getHandshakeStatus() | Возвращает текущий статус рукопожатия для этого |
abstract boolean | getNeedClientAuth() | Возвращает true, если движок будет требовать аутентификации клиента. |
String | getPeerHost() | Возвращает имя хоста удаленного узла. |
int | getPeerPort() | Возвращает номер порта удаленного узла. |
abstract SSLSession | getSession() | Возвращает |
SSLParameters | getSSLParameters() | Возвращает SSLParameters, действующие для этого SSLEngine. |
abstract String[] | getSupportedCipherSuites() | Возвращает имена наборов шифров, которые могут быть включены для использования на этом движке. |
abstract String[] | getSupportedProtocols() | Возвращает имена протоколов, которые могут быть включены для использования с этим |
abstract boolean | getUseClientMode() | Возвращает true, если движок настроен на использование клиентского режима во время рукопожатия. |
abstract boolean | getWantClientAuth() | Возвращает true, если движок будет запрашивать аутентификацию клиента. |
abstract boolean | isInboundDone() | Возвращает, будет ли |
abstract boolean | isOutboundDone() | Возвращает, будет ли |
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" и прекратит соединение.)
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