Класс SSLSocket
- Все реализуемые интерфейсы:
Closeable, AutoCloseable
public abstract class SSLSocket extends Socket
Socket и предоставляет защищённые сокеты, использующие такие протоколы, как «Secure Sockets Layer» (SSL) или протоколы «Transport Layer Security» (TLS) IETF. Такие сокеты являются обычными потоковыми сокетами, но добавляют уровень защиты поверх базового транспортного сетевого протокола, например 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
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Используется только подклассами. |
|
protected |
Используется только подклассами. |
|
protected |
Используется только подклассами. |
|
protected |
Используется только подклассами. |
|
protected |
Используется только подклассами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract void |
addHandshakeCompletedListener |
Регистрирует прослушиватель событий для получения уведомлений о завершении SSL-рукопожатия в этом соединении. |
String |
getApplicationProtocol() |
Возвращает последнее значение протокола приложения, согласованное для этого соединения. |
abstract String[] |
getEnabledCipherSuites() |
Возвращает названия наборов шифров SSL, которые в данный момент включены для использования в этом соединении. |
abstract String[] |
getEnabledProtocols() |
Возвращает названия версий протоколов, которые в данный момент включены для использования в этом соединении. |
abstract boolean |
getEnableSessionCreation() |
Возвращает true, если этот сокет может устанавливать новые SSL-сеансы. |
String |
getHandshakeApplicationProtocol() |
Возвращает значение протокола приложения, согласованное при выполняющемся в данный момент SSL/TLS-рукопожатии. |
BiFunction |
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 |
Удаляет ранее зарегистрированный прослушиватель завершения рукопожатия. |
abstract void |
setEnabledCipherSuites |
Задаёт наборы шифров, включённые для использования в этом соединении. |
abstract void |
setEnabledProtocols |
Задаёт версии протоколов, включённые для использования в этом соединении. |
abstract void |
setEnableSessionCreation |
Определяет, может ли этот сокет устанавливать новые SSL-сеансы. |
void |
setHandshakeApplicationProtocolSelector |
Регистрирует функцию обратного вызова, выбирающую значение протокола приложения для SSL/TLS/DTLS-рукопожатия. |
abstract void |
setNeedClientAuth |
Настраивает сокет так, чтобы он требовал аутентификацию клиента. |
void |
setSSLParameters |
Применяет параметры SSL к этому сокету. |
abstract void |
setUseClientMode |
Настраивает сокет на использование режима клиента (или сервера) при выполнении рукопожатия. |
abstract void |
setWantClientAuth |
Настраивает сокет так, чтобы он запрашивал аутентификацию клиента. |
abstract void |
startHandshake() |
Запускает SSL-рукопожатие в этом соединении. |
Методы, объявленные в классе 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
Подробное описание конструкторов
SSLSocket
protected SSLSocket()
SSLSocket
protected SSLSocket(String host, int port) throws IOException, UnknownHostException
- Параметры:
-
host— имя узла для подключения илиnullдля адреса обратной связи. -
port— номер порта сервера - Исключения:
-
IOException— если при создании сокета произошла ошибка ввода-вывода -
UnknownHostException— если узел не найден -
IllegalArgumentException— если значение параметра порта выходит за указанный диапазон допустимых значений портов от 0 до 65535 включительно.
SSLSocket
protected SSLSocket(InetAddress address, int port) throws IOException
- Параметры:
-
address— узел сервера -
port— его порт - Исключения:
-
IOException— если при создании сокета произошла ошибка ввода-вывода -
IllegalArgumentException— если значение параметра порта выходит за указанный диапазон допустимых значений портов от 0 до 65535 включительно. -
NullPointerException— еслиaddressимеет значение null.
SSLSocket
protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
- Параметры:
-
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
- Параметры:
-
address— узел сервера -
port— его порт -
clientAddress— адрес клиента, к которому привязан сокет, илиnullдля адресаanyLocal. -
clientPort— порт клиента, к которому привязан сокет, илиzeroдля свободного порта, выбранного системой. - Исключения:
-
IOException— если при создании сокета произошла ошибка ввода-вывода -
IllegalArgumentException— если значение параметра порта или clientPort выходит за указанный диапазон допустимых значений портов от 0 до 65535 включительно. -
NullPointerException— еслиaddressимеет значение null.
Подробное описание методов
getSupportedCipherSuites
public abstract String[] getSupportedCipherSuites()
Возвращаемый массив содержит наборы шифров из списка стандартных имён наборов шифров в разделе Имена наборов шифров JSSE спецификации «Стандартные имена алгоритмов безопасности Java», а также может содержать другие наборы шифров, поддерживаемые поставщиком.
- Возвращает:
- массив имён наборов шифров
- Внешние спецификации
- См. также:
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()
Обратите внимание: даже если набор включён, он может никогда не использоваться. Это возможно, если одноранговый узел его не поддерживает, его использование ограничено, отсутствуют необходимые сертификаты (и закрытые ключи) для набора или включён анонимный набор, но требуется аутентификация.
Возвращаемый массив содержит наборы шифров из списка стандартных имён наборов шифров в разделе Имена наборов шифров JSSE спецификации «Стандартные имена алгоритмов безопасности Java», а также может содержать другие наборы шифров, поддерживаемые поставщиком.
- Возвращает:
- массив имён наборов шифров
- Внешние спецификации
- См. также:
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites)
Каждый набор шифров в параметре suites должен быть указан в списке, возвращаемом getSupportedCipherSuites(), иначе вызов метода завершится ошибкой. После успешного вызова этого метода для использования будут включены только наборы, перечисленные в параметре suites.
Обратите внимание: стандартный список имён наборов шифров приведён в разделе Имена наборов шифров JSSE спецификации «Стандартные имена алгоритмов безопасности Java». Поставщики могут поддерживать имена наборов шифров, отсутствующие в этом списке, или использовать для определённого набора шифров имя, отличное от рекомендованного.
Дополнительные сведения о причинах, по которым определённый набор шифров может никогда не использоваться в подключении, см. в разделе getEnabledCipherSuites().
- Параметры:
-
suites— имена всех наборов шифров, которые необходимо включить - Исключения:
-
IllegalArgumentException— если один или несколько наборов шифров, указанных в параметре, не поддерживаются или параметр имеет значение null. - Внешние спецификации
- См. также:
getSupportedProtocols
public abstract String[] getSupportedProtocols()
- Возвращает:
- массив поддерживаемых протоколов
getEnabledProtocols
public abstract String[] getEnabledProtocols()
Обратите внимание: даже если протокол включён, он может никогда не использоваться. Это возможно, если одноранговый узел не поддерживает протокол, его использование ограничено или протокол не поддерживает ни один из включённых наборов шифров.
- Возвращает:
- массив протоколов
- См. также:
setEnabledProtocols
public abstract void setEnabledProtocols(String[] protocols)
Протоколы должны быть указаны методом getSupportedProtocols() как поддерживаемые. После успешного вызова этого метода для использования будут включены только протоколы, перечисленные в параметре protocols.
- Параметры:
-
protocols— имена всех протоколов, которые необходимо включить. - Исключения:
-
IllegalArgumentException— если один или несколько протоколов, указанных в параметре, не поддерживаются или параметр protocols имеет значение null. - См. также:
getSession
public abstract SSLSession getSession()
При необходимости этот метод инициирует начальное рукопожатие, а затем блокирует выполнение до его завершения.
Если во время начального рукопожатия возникает ошибка, этот метод возвращает недействительный объект сеанса, указывающий недействительный набор шифров "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
- См. также:
addHandshakeCompletedListener
public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
- Параметры:
-
listener— прослушиватель события завершения рукопожатия - Исключения:
-
IllegalArgumentException— если аргумент имеет значение null. - См. также:
removeHandshakeCompletedListener
public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
- Параметры:
-
listener— прослушиватель события завершения рукопожатия - Исключения:
-
IllegalArgumentException— если прослушиватель не зарегистрирован или аргумент имеет значение null. - См. также:
startHandshake
public abstract void startHandshake() throws IOException
Если данные уже передавались по подключению, их передача продолжается во время этого рукопожатия. О его завершении будет сообщено событием. При начальном рукопожатии подключения этот метод выполняется синхронно и возвращает управление после завершения согласования. Некоторые протоколы могут не поддерживать несколько рукопожатий в существующем сокете и могут выбросить IOException.
- Исключения:
-
IOException— при ошибке на сетевом уровне - См. также:
setUseClientMode
public abstract void setUseClientMode(boolean mode)
Этот метод необходимо вызвать до начала рукопожатия. После его начала режим нельзя изменить в течение всего срока существования сокета.
Серверы обычно проходят аутентификацию, а от клиентов этого не требуется.
- Параметры:
-
mode— true, если сокет должен начать рукопожатие в режиме «клиент» - Исключения:
-
IllegalArgumentException— если предпринимается попытка изменить режим после начала начального рукопожатия. - См. также:
getUseClientMode
public abstract boolean getUseClientMode()
- Возвращает:
- true, если сокет должен выполнять рукопожатие в режиме «клиент»
- См. также:
setNeedClientAuth
public abstract void setNeedClientAuth(boolean need)
Настройка аутентификации клиента для сокета может иметь одно из следующих значений:
- аутентификация клиента обязательна
- запрашивается аутентификация клиента
- аутентификация клиента не требуется
В отличие от setWantClientAuth(boolean), если этот параметр включён, а клиент решает не предоставлять сведения для своей аутентификации, согласование будет остановлено, а подключение закрыто.
Вызов этого метода переопределяет любые предыдущие настройки, заданные этим методом или методом setWantClientAuth(boolean).
- Параметры:
-
need— значение true, если аутентификация клиента обязательна, или false, если аутентификация клиента не требуется. - См. также:
getNeedClientAuth
public abstract boolean getNeedClientAuth()
- Возвращает:
- true, если аутентификация клиента обязательна, или false, если аутентификация клиента не требуется.
- См. также:
setWantClientAuth
public abstract void setWantClientAuth(boolean want)
Настройка аутентификации клиента для сокета может иметь одно из следующих значений:
- аутентификация клиента обязательна
- запрашивается аутентификация клиента
- аутентификация клиента не требуется
В отличие от setNeedClientAuth(boolean), если этот параметр включён, а клиент решает не предоставлять сведения для своей аутентификации, согласование будет продолжено.
Вызов этого метода переопределяет любые предыдущие настройки, заданные этим методом или методом setNeedClientAuth(boolean).
- Параметры:
-
want— значение true, если запрашивается аутентификация клиента, или false, если аутентификация клиента не требуется. - См. также:
getWantClientAuth
public abstract boolean getWantClientAuth()
- Возвращает:
- true, если запрашивается аутентификация клиента, или false, если аутентификация клиента не требуется.
- См. также:
setEnableSessionCreation
public abstract void setEnableSessionCreation(boolean flag)
- Параметры:
-
flag— значение true указывает, что сеансы можно создавать; это значение используется по умолчанию. Значение false указывает, что необходимо возобновить существующий сеанс - См. также:
getEnableSessionCreation
public abstract boolean getEnableSessionCreation()
- Возвращает:
- true указывает, что сеансы можно создавать; это значение используется по умолчанию. Значение false указывает, что необходимо возобновить существующий сеанс
- См. также:
getSSLParameters
public SSLParameters getSSLParameters()
- Возвращает:
- параметры SSLParameters, действующие для этого SSLSocket.
- С версии:
- 1.6
setSSLParameters
public void setSSLParameters(SSLParameters params)
Это означает следующее:
- Если
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
- Внешние спецификации
getHandshakeApplicationProtocol
public String getHandshakeApplicationProtocol()
Как и в случае с getHandshakeSession(), подключение может находиться в процессе рукопожатия. Значение протокола приложения может быть ещё недоступно.
- Требования к реализации:
- Реализация этого класса выбрасывает
UnsupportedOperationExceptionи не выполняет никаких других действий. - Возвращает:
- null, если ещё не определено, будут ли использоваться протоколы приложений в этом рукопожатии; пустой
String, если значения протоколов приложений использоваться не будут; либо непустойStringпротокола приложения, если значение было успешно согласовано. - Исключения:
-
UnsupportedOperationException— если нижележащий поставщик не реализует эту операцию. - С версии:
- 9
setHandshakeApplicationProtocolSelector
public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket, List<String>, String> selector)
SSLParameters.setApplicationProtocols, и поддерживает следующие параметры типов: Например, следующий вызов регистрирует функцию обратного вызова, которая проверяет параметры рукопожатия TLS и выбирает имя протокола приложения:
SSLSocket- Первый аргумент функции позволяет проверить текущий
SSLSocket, включая сеанс рукопожатия и параметры конфигурации.List<String>- Второй аргумент функции содержит имена протоколов приложений, объявленные одноранговым узлом TLS.
String- Результатом функции является имя протокола приложения или null, указывающее, что ни одно из объявленных имён не подходит. Если возвращаемое значение — пустой
String, указания протоколов приложений использоваться не будут. Если возвращается null (значение не выбрано) или значение, не объявленное одноранговым узлом, нижележащий протокол определяет дальнейшие действия. (Например, ALPN отправит оповещение "no_application_protocol" и завершит подключение.)
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()
setHandshakeApplicationProtocolSelector.- Требования к реализации:
- Реализация в этом классе выбрасывает
UnsupportedOperationExceptionи не выполняет никаких других действий. - Возвращает:
- функцию обратного вызова или null, если она не задана.
- Выбрасывает:
-
UnsupportedOperationException— если базовый поставщик не реализует эту операцию. - С версии:
- 9
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/javax/net/ssl/SSLSocket.html