Spec-Zone.ru › OpenJDK 8

Класс 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 защищает от модификации сообщений активным перехватывающим устройством.
  • Аутентификация. В большинстве режимов SSL/TLS обеспечивает аутентификацию участников. Серверы обычно аутентифицируются, а клиенты могут быть аутентифицированы по запросу серверов.
  • Конфиденциальность (защита приватности). В большинстве режимов SSL/TLS шифрует данные, передаваемые между клиентом и сервером. Это защищает конфиденциальность данных, чтобы пассивные перехватывающие устройства не могли видеть конфиденциальные данные, такие как финансовая информация или личная информация различных типов.
Эти типы защиты определяются "набором шифров", который представляет собой комбинацию криптографических алгоритмов, используемых заданным SSL-соединением. Во время процесса переговоров оба конечных узла должны согласовать набор шифров, доступный в обеих средах. Если нет такого набора в общем доступе, SSL-соединение не может быть установлено, и данные не могут быть обменяны.

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

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

Основное отличие класса SSLEngine заключается в том, что он работает с входящими и исходящими потоками байтов, независимо от механизма транспорта. Пользователь SSLEngine отвечает за организацию надёжной транспортной системы ввода-вывода для удалённого узла. Разделяя абстракцию SSL/TLS и механизм транспортного обеспечения ввода-вывода, класс 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 "alert", "change_cipher_spec" и "handshake").

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

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

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

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

Класс SSLEngine производит/потребляет только полные пакеты SSL/TLS и не хранит данные приложения в памяти между вызовами 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()) {
   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-соединение. Протоколы SSL/TLS имеют сообщения о закрытии, и эти сообщения должны быть переданы удалённому узлу перед освобождением класса SSLEngine и закрытием базового механизма транспорта. Закрытие может быть инициировано одним из следующих способов: SSLException, сообщение о входящем закрытии, или одним из методов закрытия. Во всех случаях сообщения о закрытии генерируются движком, и wrap() должен быть повторно вызван до тех пор, пока статус возвращаемого значения SSLEngineResult не станет "CLOSED", или пока isOutboundDone() не вернёт true. Все данные, полученные из метода wrap(), должны быть отправлены удалённому узлу.

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

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

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

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

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

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

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

    Например:

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

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

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

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

protected SSLEngine(String peerHost, int peerPort)

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

Методы

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

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

abstract void closeInbound()

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

abstract void closeOutbound()

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

String getApplicationProtocol()

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

abstract Runnable getDelegatedTask()

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

abstract String[] getEnabledCipherSuites()

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

abstract String[] getEnabledProtocols()

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

abstract boolean getEnableSessionCreation()

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

String getHandshakeApplicationProtocol()

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

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

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

SSLSession getHandshakeSession()

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

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 сетевые данные в буфер данных приложения в формате обычного текста.

SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts)

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

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

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

SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst)

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

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

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

SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst)

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

Методы, унаследованные от класса 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 сети.

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

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.

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

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. Эта операция "сборки" кодирует последовательность байтов из одного или нескольких заданных буферов в одном вызове. Операции сбора часто полезны при реализации сетевых протоколов или форматов файлов, которые, например, группируют данные в сегменты, состоящие из одного или нескольких заголовков фиксированной длины, за которыми следует тело переменной длины. См. GatheringByteChannel для получения дополнительной информации о сборе и GatheringByteChannel.write(ByteBuffer[], int, int) для получения дополнительной информации о поведении подпоследовательности.

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

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

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

Этот метод попытается создать записи SSL/TLS и потребляет как можно больше исходных данных, но никогда не потребляет больше, чем сумма оставшихся байтов в каждом буфере. Позиция каждого 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 в буфер данных приложения в формате обычного текста.

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

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 в последовательность буферов данных приложения в формате обычного текста.

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

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 в последовательность буферов данных приложения в виде открытого текста. Эта операция "рассеивания" декодирует последовательность байтов в один или несколько буферов из заданной последовательности в одном вызове. Рассеивание часто полезно при реализации сетевых протоколов или форматов файлов, которые, например, группируют данные в сегменты, состоящие из одного или нескольких заголовков фиксированной длины, за которыми следует тело переменной длины. См. ScatteringByteChannel для получения дополнительной информации о рассеивании и ScatteringByteChannel.read(ByteBuffer[], int, int) для получения дополнительной информации о поведении подпоследовательностей.

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

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

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

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

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

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

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

Параметры:
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. Это гарантирует закрытие входящей стороны и проверяет, что партнёр правильно выполнил процедуру закрытия SSL/TLS, тем самым обнаруживая возможные атаки с усечением.

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

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

Исключения:
SSLException - если этот движок не получил правильное сообщение о закрытии SSL/TLS от партнёра.
См. также:
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()

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

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

getEnabledCipherSuites

public abstract String[] getEnabledCipherSuites()

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

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

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

setEnabledCipherSuites

public abstract void setEnabledCipherSuites(String[] suites)

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

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

См. 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.

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

Этот метод предоставляет ранний доступ к 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, текущая сессия должна быть недействительной перед вызовом этого метода.

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

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

getHandshakeStatus

public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()

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

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

setUseClientMode

public abstract void setUseClientMode(boolean mode)

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

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

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

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

getUseClientMode

public abstract boolean getUseClientMode()

Возвращает 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. Наборы шифров и протоколов возвращаемых 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 - если базовый поставщик не реализует операцию.
С:
8

getHandshakeApplicationProtocol

public String getHandshakeApplicationProtocol()

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

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

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

setHandshakeApplicationProtocolSelector

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

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

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

getHandshakeApplicationProtocolSelector

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

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

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

© 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.

Spec-Zone.ru

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