Spec-Zone.ru › OpenJDK 24

Класс 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 шифрует данные, передаваемые между клиентом и сервером. Это защищает конфиденциальность данных, так что пассивные перехватывающие устройства не увидят конфиденциальные данные, такие как финансовая информация или личная информация многих типов.
Эти виды защиты задаются "набором шифров", представляющим собой комбинацию криптографических алгоритмов, используемых для данного 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(). Поэтому входные и выходные ByteBuffer должны быть достаточно большими для хранения максимального пакета. Для определения соответствующих размеров буферов следует использовать вызовы SSLSession.getPacketBufferSize() и SSLSession.getApplicationBufferSize(). Размер выходного буфера данных приложения обычно не имеет значения. Если условия буфера не позволяют правильно потреблять/производить данные, приложение должно определить (через SSLEngineResult) и исправить проблему, а затем повторить вызов.

Например, unwrap() вернет результат SSLEngineResult.Status.BUFFER_OVERFLOW, если движок определит, что места в целевом буфере недостаточно. Приложения должны вызвать SSLSession.getApplicationBufferSize() и сравнить это значение с размером, доступным в целевом буфере, увеличив буфер при необходимости. Аналогично, если unwrap() вернет SSLEngineResult.Status.BUFFER_UNDERFLOW, приложение должно вызвать SSLSession.getPacketBufferSize(), чтобы убедиться, что исходный буфер достаточно велик для хранения пакета (увеличив его при необходимости), и затем получить больше входящих данных.


   SSLEngineResult r = engine.unwrap(src, dst);
   switch (r.getStatus()) {
   case BUFFER_OVERFLOW:
       // Could attempt to drain the dst buffer of any already obtained
       // data, but we'll just increase it to the size needed.
       int appSize = engine.getSession().getApplicationBufferSize();
       ByteBuffer b = ByteBuffer.allocate(appSize + dst.position());
       dst.flip();
       b.put(dst);
       dst = b;
       // retry the operation.
       break;
   case BUFFER_UNDERFLOW:
       int netSize = engine.getSession().getPacketBufferSize();
       // Resize buffer if needed.
       if (netSize > src.capacity()) {
           ByteBuffer b = ByteBuffer.allocate(netSize);
           src.flip();
           b.put(src);
           src = b;
       }
       // Obtain more inbound network data for src,
       // then retry the operation.
       break;
   // other cases: CLOSED, OK.
   }
 

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

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

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

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

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

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

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

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

Значения ApplicationProtocol String, возвращаемые методами в этом классе, представлены в сетевом байтовом представлении, отправляемом узлом. Байты можно напрямую сравнивать или преобразовывать в формат Unicode String для сравнения.

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

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

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

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

     //
     // Alternatively match using string.equals() if we know the ALPN value
     // was encoded from a String using a certain character set,
     // for example UTF-8.  The ALPN value must first be properly
     // decoded to a Unicode String before use.
     //
     String unicodeString = new String(bytes, StandardCharsets.UTF_8);
     if (unicodeString.equals(HTTP1_1)
             || unicodeString.equals("\uabcd\uabce\uabcf")) {
         ...
     }
 
Примечания по конкурентности: Следует учитывать две проблемы конкурентности:
  1. Методы wrap() и unwrap() могут выполняться одновременно друг с другом.
  2. Протоколы SSL/TLS/DTLS используют упорядоченные пакеты. Приложения должны позаботиться о том, чтобы сгенерированные пакеты передавались последовательно. Если пакеты приходят в неупорядоченном порядке, могут возникнуть непредвиденные или фатальные результаты.

    Например:

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

Краткое описание конструкторов

SSLEngine()
SSLEngine(String peerHost, int peerPort)
Модификатор Конструктор Описание
protected
Конструктор для SSLEngine, не предоставляющего подсказок для стратегии повторного использования внутренней сессии.
protected
Конструктор для 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 - a ByteBuffer содержащий исходящие данные приложения
dst - a ByteBuffer для хранения исходящих сетевых данных
Возвращает:
SSLEngineResult описывающий результат этой операции.
Исключения:
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 - массив ByteBuffers, содержащий исходящие данные приложения
dst - a ByteBuffer для хранения исходящих сетевых данных
Возвращает:
SSLEngineResult, описывающий результат этой операции.
Исключения:
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 - массив ByteBuffers, содержащий исходящие данные приложения
offset - Смещение в массиве буферов первого буфера, из которого будут извлекаться байты; оно должно быть неотрицательным и не больше srcs.length
length - Максимальное количество буферов для доступа; оно должно быть неотрицательным и не больше srcs.length - offset
dst - a ByteBuffer для хранения исходящих сетевых данных
Возвращает:
SSLEngineResult, описывающий результат этой операции.
Исключения:
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 - a ByteBuffer, содержащий входящие сетевые данные.
dst - a ByteBuffer для хранения входящих данных приложения.
Возвращает:
SSLEngineResult, описывающий результат этой операции.
Исключения:
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 - a ByteBuffer, содержащий входящие сетевые данные.
dsts - массив ByteBuffer для хранения входящих данных приложения.
Возвращает:
a SSLEngineResult, описывающий результат этой операции.
Исключения:
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, этот метод может потреблять сетевые данные без создания каких-либо данных приложения (например, он может потреблять данные рукопожатия).

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

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

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

Базовая память, используемая буферами src и dsts ByteBuffer, не должна совпадать.

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

Дополнительную информацию о закрытии движка см. в описании класса.

Параметры:
src - a ByteBuffer, содержащий входящие сетевые данные.
dsts - массив буферов ByteBuffer для хранения входящих данных приложения.
offset - Смещение в массиве буферов первого буфера, из которого должны быть переданы байты; оно должно быть неотрицательным и не больше, чем dsts.length.
length - Максимальное количество буферов для доступа; оно должно быть неотрицательным и не больше, чем dsts.length - offset.
Возвращает:
a 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 больше не нужен и может быть удален.

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

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

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

closeInbound

public abstract void closeInbound() throws SSLException
Указывает, что больше никаких входящих сетевых данных не будут отправлены этому SSLEngine.

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

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

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

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

Исключения:
SSLException - если этот движок не получил надлежащее сообщение о закрытии SSL/TLS/DTLS от peer.
Внешние спецификации
  • RFC 2246: Протокол TLS версии 1.0
См. также:
  • 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 может генерировать данные рукопожатия закрытия, которые должны быть отправлены peer. wrap() необходимо вызвать для генерации этих данных. Когда этот метод возвращает true, больше исходящих данных не будет создано.

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

getSupportedCipherSuites

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

Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе JSSE Cipher Suite Names спецификации стандартных имён алгоритмов Java Security, а также может включать и другие наборы шифрования, поддерживаемые поставщиком.

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

getEnabledCipherSuites

public abstract String[] getEnabledCipherSuites()
Возвращает имена наборов шифрования SSL, которые в настоящее время включены для использования в этом движке. Когда SSLEngine создается впервые, все включенные наборы шифрования поддерживают минимальное качество обслуживания. Таким образом, в некоторых средах это значение может быть пустым.

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

Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе JSSE Cipher Suite Names спецификации стандартных имён алгоритмов Java Security, а также может включать и другие наборы шифрования, поддерживаемые поставщиком.

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

setEnabledCipherSuites

public abstract void setEnabledCipherSuites(String[] suites)
Устанавливает наборы шифрования, включенные для использования в этом движке.

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

Обратите внимание, что стандартный список имён наборов шифрования можно найти в разделе JSSE Cipher Suite Names спецификации стандартных имён алгоритмов Java Security. Поставщики могут поддерживать имена наборов шифрования, не найденные в этом списке, или могут не использовать рекомендуемое имя для определённого набора шифрования.

См. 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()
Возвращает сеанс, используемый в этом SSLEngine.

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

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

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

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

getHandshakeSession

public SSLSession getHandshakeSession()
Возвращает сеанс, который создается во время рукопожатия 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()
Возвращает SSLParameters, действующие для этого SSLEngine. Cipher suites и протоколы возвращаемых SSLParameters всегда не null.
Возвращаемое значение:
SSLParameters, действующие для этого 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, протокол согласования приложений (ALPN), могут согласовывать значения уровня приложения между узлами.

Требования реализации:
Реализация в этом классе выбрасывает UnsupportedOperationException и не выполняет никаких других действий.
Возвращаемое значение:
null, если ещё не определено, могут ли быть использованы протоколы приложения для этого соединения; пустая строка String, если протоколы приложения не будут использоваться; или непустой протокол приложения String, если значение было успешно согласовано.
Исключения:
UnsupportedOperationException - если базовый поставщик не реализует операцию.
С:
9
Внешние спецификации
  • RFC 7301: Протокол согласования приложений (ALPN) для транспорта TLS

getHandshakeApplicationProtocol

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

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

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

setHandshakeApplicationProtocolSelector

public void setHandshakeApplicationProtocolSelector(BiFunction<SSLEngine, List<String>, String> selector)
Регистрирует функцию обратного вызова, которая выбирает значение протокола приложения для рукопожатия SSL/TLS/DTLS. Функция переопределяет любые значения, заданные с помощью SSLParameters.setApplicationProtocols, и поддерживает следующие типы параметров:
SSLEngine
Первый аргумент функции позволяет просмотреть текущие SSLEngine, включая сеанс рукопожатия и параметры конфигурации.
List<String>
Второй аргумент функции содержит список имён протоколов приложения, объявленных peer TLS.
String
Результатом функции является имя протокола приложения или null, чтобы указать, что ни одно из объявленных имён неприемлемо. Если возвращаемое значение — пустая String, то указания протокола приложения не будут использоваться. Если возвращаемое значение 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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/javax/net/ssl/SSLEngine.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API