Spec-Zone.ru › OpenJDK 27

Класс SSLSocket

java.lang.Object
java.net.Socket
javax.net.ssl.SSLSocket
Все реализованные интерфейсы:
Closeable, AutoCloseable
public abstract class SSLSocket extends Socket
Этот класс расширяет Socket и предоставляет защищённые сокеты с использованием таких протоколов, как «Secure Sockets Layer» (SSL) или протоколы IETF «Transport Layer Security» (TLS).

Такие сокеты являются обычными потоковыми сокетами, но добавляют уровень защиты поверх базового сетевого транспортного протокола, например TCP. Эта защита включает:

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

Эти виды защиты определяются «набором шифров» — комбинацией криптографических алгоритмов, используемых данным SSL-соединением. В процессе согласования обе конечные точки должны выбрать набор шифров, доступный в обеих средах. Если общего набора нет, установить SSL-соединение невозможно, и обмен данными не состоится.

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

  • вызовом startHandshake, который явно запускает рукопожатие, или
  • при любой попытке чтения или записи данных приложения через этот сокет выполняется неявное рукопожатие, или
  • вызов getSession пытается установить сеанс, если в данный момент нет действующего сеанса; при этом выполняется неявное рукопожатие.

Если рукопожатие завершается с ошибкой по какой-либо причине, SSLSocket закрывается, и дальнейший обмен данными становится невозможен.

При управлении наборами шифров важно знать о двух группах наборов:

  • Наборы шифров, поддерживаемые реализацией SSL. Этот список предоставляется с помощью getSupportedCipherSuites.
  • Наборы шифров, включённые для использования; их может быть меньше, чем поддерживается в целом. Эта группа задаётся с помощью метода setEnabledCipherSuites и запрашивается с помощью метода getEnabledCipherSuites. Изначально для нового сокета включается набор шифров по умолчанию, соответствующий минимальной рекомендуемой конфигурации.

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

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

Можно зарегистрироваться для получения уведомления о завершении рукопожатия. Для этого используются два дополнительных класса. Объекты HandshakeCompletedEvent передаются экземплярам HandshakeCompletedListener, зарегистрированным пользователями этого API. SSLSocket создаётся с помощью SSLSocketFactory или путём acceptения соединения из SSLServerSocket.

SSL-сокет должен работать в режиме клиента или сервера. Это определяет, кто начинает процесс рукопожатия, а также какие сообщения должна отправлять каждая сторона. Для успешного выполнения рукопожатия в каждом соединении должны быть один клиент и один сервер. После начала первоначального рукопожатия сокет не может переключаться между режимами клиента и сервера, даже при повторном согласовании параметров.

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

    String networkString = sslSocket.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")) {
        ...
    }
Примечание к API:
Когда соединение больше не требуется, клиентское и серверное приложения должны закрыть обе стороны соответствующего соединения. Это можно сделать сразу, вызвав Socket.close(), или закрыть каждую сторону отдельно с помощью Socket.shutdownOutput() / Socket.shutdownInput(). Такой способ полезен для версий протокола, поддерживающих наполовину закрытые соединения.

Обратите внимание, что в некоторых случаях закрытие входного потока может зависеть от того, закрыт ли сначала выходной поток узла. Если соединение закрывается неупорядоченным образом (например, Socket.shutdownInput() вызывается до получения уведомления о закрытии записи узлом), могут возникнуть исключения, указывающие на ошибку.

После закрытия SSLSocket повторно использовать его нельзя: необходимо создать новый SSLSocket.

С версии:
1.4
См. также:
  • Socket
  • SSLServerSocket
  • SSLSocketFactory

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

SSLSocket()
SSLSocket(String host, int port)
SSLSocket(String host, int port, InetAddress clientAddress, int clientPort)
SSLSocket(InetAddress address, int port)
SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort)
Модификатор Конструктор Описание
protected
Используется только подклассами.
protected
Используется только подклассами.
protected
Используется только подклассами.
protected
Используется только подклассами.
protected
Используется только подклассами.

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

Модификатор и тип Метод Описание
abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
Регистрирует прослушиватель событий для получения уведомлений о завершении SSL-рукопожатия в этом соединении.
String getApplicationProtocol()
Возвращает последнее значение протокола приложения, согласованное для этого соединения.
abstract String[] getEnabledCipherSuites()
Возвращает имена наборов шифров SSL, включённых в данный момент для использования в этом соединении.
abstract String[] getEnabledProtocols()
Возвращает имена версий протокола, включённых в данный момент для использования в этом соединении.
abstract boolean getEnableSessionCreation()
Возвращает true, если этот сокет может устанавливать новые SSL-сеансы.
String getHandshakeApplicationProtocol()
Возвращает значение протокола приложения, согласованное во время выполняемого SSL/TLS-рукопожатия.
BiFunction<SSLSocket, List<String>, String> getHandshakeApplicationProtocolSelector()
Получает функцию обратного вызова, которая выбирает значение протокола приложения во время SSL/TLS/DTLS-рукопожатия.
SSLSession getHandshakeSession()
Возвращает SSLSession, создаваемый во время SSL/TLS-рукопожатия.
abstract boolean getNeedClientAuth()
Возвращает true, если сокет будет требовать аутентификацию клиента.
abstract SSLSession getSession()
Возвращает SSL-сеанс, используемый этим соединением.
SSLParameters getSSLParameters()
Возвращает параметры SSL, действующие для этого SSLSocket.
abstract String[] getSupportedCipherSuites()
Возвращает имена наборов шифров, которые можно включить для использования в этом соединении.
abstract String[] getSupportedProtocols()
Возвращает имена протоколов, которые можно включить для использования в SSL-соединении.
abstract boolean getUseClientMode()
Возвращает true, если для сокета задан клиентский режим рукопожатия.
abstract boolean getWantClientAuth()
Возвращает true, если сокет будет запрашивать аутентификацию клиента.
abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
Удаляет ранее зарегистрированный прослушиватель завершения рукопожатия.
abstract void setEnabledCipherSuites(String[] suites)
Задаёт наборы шифров, включённые для использования в этом соединении.
abstract void setEnabledProtocols(String[] protocols)
Задаёт версии протокола, включённые для использования в этом соединении.
abstract void setEnableSessionCreation(boolean flag)
Управляет возможностью установки новых SSL-сеансов этим сокетом.
void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket, List<String>, String> selector)
Регистрирует функцию обратного вызова, которая выбирает значение протокола приложения для SSL/TLS/DTLS-рукопожатия.
abstract void setNeedClientAuth(boolean need)
Настраивает сокет так, чтобы он требовал аутентификацию клиента.
void setSSLParameters(SSLParameters params)
Применяет параметры SSL к этому сокету.
abstract void setUseClientMode(boolean mode)
Настраивает сокет для работы в режиме клиента или сервера при выполнении рукопожатия.
abstract void setWantClientAuth(boolean want)
Настраивает сокет так, чтобы он запрашивал аутентификацию клиента.
abstract void startHandshake()
Запускает рукопожатие для этого SSLSocket.

Методы, объявленные в классе Socket

bind, close, connect, connect, getChannel, getInetAddress, getInputStream, getKeepAlive, getLocalAddress, getLocalPort, getLocalSocketAddress, getOOBInline, getOption, getOutputStream, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoLinger, getSoTimeout, getTcpNoDelay, getTrafficClass, isBound, isClosed, isConnected, isInputShutdown, isOutputShutdown, sendUrgentData, setKeepAlive, setOOBInline, setOption, setPerformancePreferences, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSocketImplFactory, setSoLinger, setSoTimeout, setTcpNoDelay, setTrafficClass, shutdownInput, shutdownOutput, supportedOptions, toString
Модификатор и тип Метод Описание
void bind(SocketAddress bindpoint)
Привязывает сокет к локальному адресу.
void close()
Закрывает этот сокет.
void connect(SocketAddress endpoint)
Подключает этот сокет к серверу.
void connect(SocketAddress endpoint, int timeout)
Подключает этот сокет к серверу с заданным значением времени ожидания.
SocketChannel getChannel()
Возвращает уникальный объект SocketChannel, связанный с этим сокетом, если такой объект существует.
InetAddress getInetAddress()
Возвращает адрес, к которому подключён сокет.
InputStream getInputStream()
Возвращает входной поток для этого сокета.
boolean getKeepAlive()
Проверяет, включён ли параметр SO_KEEPALIVE.
InetAddress getLocalAddress()
Получает локальный адрес, к которому привязан сокет.
int getLocalPort()
Возвращает номер локального порта, к которому привязан этот сокет.
SocketAddress getLocalSocketAddress()
Возвращает адрес конечной точки, к которой привязан этот сокет.
boolean getOOBInline()
Проверяет, включён ли параметр SO_OOBINLINE.
<T> T getOption(SocketOption<T> name)
Возвращает значение параметра сокета.
OutputStream getOutputStream()
Возвращает выходной поток для этого сокета.
int getPort()
Возвращает номер удалённого порта, к которому подключён этот сокет.
int getReceiveBufferSize()
Получает значение параметра SO_RCVBUF для этого Socket, то есть размер буфера, используемого платформой для ввода данных через этот Socket.
SocketAddress getRemoteSocketAddress()
Возвращает адрес конечной точки, к которой подключён этот сокет, или null, если он не подключён.
boolean getReuseAddress()
Проверяет, включён ли параметр SO_REUSEADDR.
int getSendBufferSize()
Получает значение параметра SO_SNDBUF для этого Socket, то есть размер буфера, используемого платформой для вывода данных через этот Socket.
int getSoLinger()
Возвращает значение параметра SO_LINGER. Возвращаемое значение -1 означает, что параметр отключён.
int getSoTimeout()
Возвращает значение параметра SO_TIMEOUT. Возвращаемое значение 0 означает, что параметр отключён (то есть время ожидания не ограничено).
boolean getTcpNoDelay()
Проверяет, включён ли параметр TCP_NODELAY.
int getTrafficClass()
Получает класс трафика или тип обслуживания в заголовке IP для пакетов, отправляемых этим сокетом.
boolean isBound()
Возвращает состояние привязки сокета.
boolean isClosed()
Возвращает состояние закрытия сокета.
boolean isConnected()
Возвращает состояние соединения сокета.
boolean isInputShutdown()
Возвращает true, если чтение из сокета было отключено.
boolean isOutputShutdown()
Возвращает true, если запись в сокет была отключена.
void sendUrgentData(int data)
Отправляет один байт срочных данных через сокет.
void setKeepAlive(boolean on)
Включает или отключает параметр SO_KEEPALIVE.
void setOOBInline(boolean on)
Включает или отключает параметр SO_OOBINLINE (получение срочных данных TCP). По умолчанию этот параметр отключён, и полученные через сокет срочные данные TCP молча отбрасываются.
<T> Socket setOption(SocketOption<T> name, T value)
Задаёт значение параметра сокета.
void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии.
Этот метод предназначался для поддержки протоколов, которые теперь устарели.
void setReceiveBufferSize(int size)
Задаёт для этого Socket указанное значение параметра SO_RCVBUF.
void setReuseAddress(boolean on)
Включает или отключает параметр сокета SO_REUSEADDR.
void setSendBufferSize(int size)
Задаёт для этого Socket указанное значение параметра SO_SNDBUF.
static void setSocketImplFactory(SocketImplFactory fac)
Устарело.
Используйте SocketFactory и напрямую создайте подкласс Socket.
void setSoLinger(boolean on, int linger)
Включает или отключает параметр SO_LINGER, задавая время ожидания в секундах.
void setSoTimeout(int timeout)
Включает или отключает параметр SO_TIMEOUT, задавая время ожидания в миллисекундах.
void setTcpNoDelay(boolean on)
Включает или отключает параметр TCP_NODELAY (отключает или включает алгоритм Нейгла).
void setTrafficClass(int tc)
Задаёт класс трафика или октет типа обслуживания в заголовке IP для пакетов, отправляемых этим сокетом.
void shutdownInput()
Отключает чтение из соединения, не закрывая сокет.
void shutdownOutput()
Отключает запись в соединение, не закрывая сокет.
Set<SocketOption<?>> supportedOptions()
Возвращает набор параметров сокета, поддерживаемых этим сокетом.
String toString()
Преобразует этот сокет в String.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии.
Финализация устарела и может быть удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного периода реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного периода реального времени.

Подробное описание конструкторов

SSLSocket

protected SSLSocket()
Используется только подклассами. Создаёт неинициализированный TCP-сокет без подключения.

SSLSocket

protected SSLSocket(String host, int port) throws IOException, UnknownHostException
Используется только подклассами. Создаёт TCP-подключение к указанному узлу по заданному порту. Работает в качестве SSL-клиента.
Параметры:
host — имя узла, к которому нужно подключиться, или null для адреса обратной петли.
port — номер порта сервера
Исключения:
IOException — если при создании сокета произошла ошибка ввода-вывода
UnknownHostException — если узел неизвестен
IllegalArgumentException — если значение параметра порта выходит за пределы указанного допустимого диапазона от 0 до 65535 включительно.

SSLSocket

protected SSLSocket(InetAddress address, int port) throws IOException
Используется только подклассами. Создаёт TCP-подключение к серверу по заданному адресу и порту. Работает в качестве SSL-клиента.
Параметры:
address — узел сервера
port — его порт
Исключения:
IOException — если при создании сокета произошла ошибка ввода-вывода
IllegalArgumentException — если значение параметра порта выходит за пределы указанного допустимого диапазона от 0 до 65535 включительно.
NullPointerException — если address равно null.

SSLSocket

protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
Используется только подклассами. Создаёт SSL-подключение к указанному узлу по заданному порту, привязывая клиентскую сторону подключения к заданному адресу и порту. Работает в качестве SSL-клиента.
Параметры:
host — имя узла, к которому нужно подключиться, или null для адреса обратной петли.
port — номер порта сервера
clientAddress — адрес клиента, к которому привязан сокет, или null для адреса anyLocal.
clientPort — порт клиента, к которому привязан сокет, или zero для свободного порта, выбранного системой.
Исключения:
IOException — если при создании сокета произошла ошибка ввода-вывода
UnknownHostException — если узел неизвестен
IllegalArgumentException — если значение параметра порта или clientPort выходит за пределы указанного допустимого диапазона от 0 до 65535 включительно.

SSLSocket

protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
Используется только подклассами. Создаёт SSL-подключение к серверу по заданному адресу и TCP-порту, привязывая клиентскую сторону подключения к заданному адресу и порту. Работает в качестве SSL-клиента.
Параметры:
address — узел сервера
port — его порт
clientAddress — адрес клиента, к которому привязан сокет, или null для адреса anyLocal.
clientPort — порт клиента, к которому привязан сокет, или zero для свободного порта, выбранного системой.
Исключения:
IOException — если при создании сокета произошла ошибка ввода-вывода
IllegalArgumentException — если значение параметра порта или clientPort выходит за пределы указанного допустимого диапазона от 0 до 65535 включительно.
NullPointerException — если address равно null.

Подробное описание методов

getSupportedCipherSuites

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

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

Возвращает:
массив имён наборов шифров
Внешние спецификации
  • Стандартные имена алгоритмов безопасности Java
См. также:
  • getEnabledCipherSuites()
  • setEnabledCipherSuites(String [])

getEnabledCipherSuites

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

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

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

Возвращает:
массив имён наборов шифров
Внешние спецификации
  • Стандартные имена алгоритмов безопасности Java
См. также:
  • getSupportedCipherSuites()
  • setEnabledCipherSuites(String [])

setEnabledCipherSuites

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

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

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

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

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

getSupportedProtocols

public abstract String[] getSupportedProtocols()
Возвращает имена протоколов, которые можно включить для использования в SSL-подключении.
Возвращает:
массив поддерживаемых протоколов

getEnabledProtocols

public abstract String[] getEnabledProtocols()
Возвращает имена версий протоколов, которые в настоящее время включены для использования в этом подключении.

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

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

setEnabledProtocols

public abstract void setEnabledProtocols(String[] protocols)
Задаёт версии протоколов, включённые для использования в этом подключении.

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

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

getSession

public abstract SSLSession getSession()
Возвращает SSL-сеанс, используемый этим подключением. Такие сеансы могут длиться долго и часто соответствуют полному сеансу входа в систему пользователя. Сеанс определяет конкретный набор шифров, активно используемый всеми подключениями в этом сеансе, а также идентификаторы клиента и сервера сеанса.

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

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

Возвращает:
SSLSession

getHandshakeSession

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

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

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

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

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

addHandshakeCompletedListener

public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
Регистрирует прослушиватель событий, который будет получать уведомления о завершении SSL-рукопожатия в этом подключении.
Параметры:
listener — прослушиватель события HandShake Completed
Исключения:
IllegalArgumentException — если аргумент равен null.
См. также:
  • startHandshake()
  • removeHandshakeCompletedListener(HandshakeCompletedListener)

removeHandshakeCompletedListener

public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
Удаляет ранее зарегистрированный прослушиватель завершения рукопожатия.
Параметры:
listener — прослушиватель события HandShake Completed
Исключения:
IllegalArgumentException — если прослушиватель не зарегистрирован или аргумент равен null.
См. также:
  • addHandshakeCompletedListener(HandshakeCompletedListener)

startHandshake

public abstract void startHandshake() throws IOException
Запускает рукопожатие для этого SSLSocket.

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

Поведение этого метода зависит от протокола (и, возможно, реализации). Например, в TLSv1.3 вызов этого метода после установления подключения инициирует обновление ключа. В предыдущих версиях TLS он инициирует повторное согласование (повторное рукопожатие).

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

Для начального рукопожатия в подключении этот метод является синхронным и возвращает управление после завершения согласования. Некоторые протоколы могут не поддерживать несколько рукопожатий в существующем сокете и могут вызвать IOException.

Исключения:
IOException — при ошибке на сетевом уровне
См. также:
  • addHandshakeCompletedListener(HandshakeCompletedListener)

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, действующие для этого SSLSocket. Наборы шифров и протоколы возвращаемого SSLParameters всегда отличны от null.
Возвращает:
параметры SSLParameters, действующие для этого SSLSocket.
С версии:
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: расширение согласования протоколов прикладного уровня для протокола защиты транспортного уровня (TLS)

getHandshakeApplicationProtocol

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

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

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

setHandshakeApplicationProtocolSelector

public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket, List<String>, String> selector)
Регистрирует функцию обратного вызова, которая выбирает значение протокола приложения для рукопожатия SSL/TLS/DTLS. Эта функция переопределяет любые значения, заданные с помощью SSLParameters.setApplicationProtocols, и поддерживает следующие параметры типа:
SSLSocket
Первый аргумент функции позволяет просматривать текущий SSLSocket, включая сеанс рукопожатия и параметры конфигурации.
List<String>
Второй аргумент функции содержит имена протоколов приложения, объявленные узлом TLS.
String
Результатом функции является имя протокола приложения или null, указывающий, что ни одно из объявленных имён не подходит. Если возвращаемое значение — пустой String, то указания протокола приложения использоваться не будут. Если возвращаемое значение равно null (значение не выбрано) или не было объявлено узлом, базовый протокол определит, какие действия предпринять. (Например, ALPN отправит оповещение "no_application_protocol" и завершит соединение.)
Например, следующий вызов регистрирует функцию обратного вызова, которая анализирует параметры рукопожатия TLS и выбирает имя протокола приложения:
    serverSocket.setHandshakeApplicationProtocolSelector(
        (serverSocket, clientProtocols) -> {
            SSLSession session = serverSocket.getHandshakeSession();
            return chooseApplicationProtocol(
                serverSocket,
                clientProtocols,
                session.getProtocol(),
                session.getCipherSuite());
        });
Примечание к API:
Это метод следует вызывать серверным приложениям TLS до начала рукопожатия TLS. Кроме того, этот SSLSocket следует настроить с параметрами, совместимыми с протоколом приложения, выбранным функцией обратного вызова. Например, включение неудачно подобранного набора шифров может привести к тому, что подходящий протокол приложения не будет найден. См. SSLParameters.
Требования к реализации:
Реализация этого класса выбрасывает UnsupportedOperationException и не выполняет никаких других действий.
Параметры:
selector — функция обратного вызова или null для отмены регистрации.
Исключения:
UnsupportedOperationException — если базовый поставщик не реализует эту операцию.
Начиная с версии:
9

getHandshakeApplicationProtocolSelector

public BiFunction<SSLSocket, List<String>, String> getHandshakeApplicationProtocolSelector()
Возвращает функцию обратного вызова, которая выбирает значение протокола приложения во время рукопожатия SSL/TLS/DTLS. О параметрах типа функции см. setHandshakeApplicationProtocolSelector.
Требования к реализации:
Реализация этого класса выбрасывает UnsupportedOperationException и не выполняет никаких других действий.
Возвращает:
функцию обратного вызова или null, если она не задана.
Исключения:
UnsupportedOperationException — если базовый поставщик не реализует эту операцию.
Начиная с версии:
9

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, включая концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

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

Spec-Zone.ru

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