Класс 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-сокет должен выбрать работу в режиме клиента или сервера. Это определит, кто инициирует процесс рукопожатия, а также какие сообщения должны отправляться каждой стороной. Каждое соединение должно иметь один клиент и один сервер, иначе рукопожатие не будет правильно выполнено. После начала первоначального рукопожатия сокет не может переключаться между режимами клиента и сервера, даже при повторных рукопожатиях.
Значения 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() |
Возвращает SSLParameters, действующие для этого 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 |
Применяет SSLParameters к этому сокету. |
abstract void |
setUseClientMode |
Настраивает сокет для использования клиентского (или серверного) режима при рукопожатии. |
abstract void |
setWantClientAuth |
Настраивает сокет на запрос аутентификации клиента. |
abstract void |
startHandshake() |
Запускает рукопожатие SSL в этом соединении. |
Методы, объявленные в классе java.net.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 Cipher Suite Names спецификации имён стандартных алгоритмов безопасности Java, а также может включать и другие наборы шифров, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифров
- См. также:
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()
Обратите внимание, что даже если набор включён, он может никогда не использоваться. Это может произойти, если противоположная сторона не поддерживает его, или его использование ограничено, или требуемые сертификаты (и закрытые ключи) для набора недоступны, или анонимный набор включён, но требуется аутентификация.
Возвращаемый массив включает наборы шифров из списка стандартных имён наборов шифров в разделе JSSE Cipher Suite Names спецификации имён стандартных алгоритмов безопасности Java, а также может включать и другие наборы шифров, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифров
- См. также:
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites)
Каждый набор шифров в параметре suites должен был быть перечислен в getSupportedCipherSuites(), иначе метод завершится ошибкой. После успешного вызова этого метода, только наборы, перечисленные в параметре suites, будут включены для использования.
Обратите внимание, что стандартный список имён наборов шифров можно найти в разделе JSSE Cipher Suite Names спецификации имён стандартных алгоритмов безопасности 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- при неподдержке одного или более протоколов, указанных в параметре, или если параметр равен 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(), этот метод не инициирует начальное рукопожатие и не блокируется до завершения рукопожатия.
- Returns:
- null, если этот экземпляр в настоящее время не проходит рукопожатие или если текущее рукопожатие не продвинулось достаточно далеко для создания базовой SSLSession. В противном случае этот метод возвращает
SSLSession, который в настоящее время согласовывается. - Throws:
-
UnsupportedOperationException- если базовый поставщик не реализует операцию. - Since:
- 1.7
- See Also:
addHandshakeCompletedListener
public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
- Parameters:
-
listener- обработчик событий завершения рукопожатия - Throws:
-
IllegalArgumentException- если аргумент равен null. - See Also:
removeHandshakeCompletedListener
public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
- Parameters:
-
listener- обработчик событий завершения рукопожатия - Throws:
-
IllegalArgumentException- если обработчик не зарегистрирован или аргумент равен null. - See Also:
startHandshake
public abstract void startHandshake() throws IOException
Если данные уже отправлены по соединению, они продолжают передаваться во время этого рукопожатия. По завершении рукопожатия об этом будет сигнализировано событием. Этот метод является синхронным для начального рукопожатия в соединении и возвращает значение, когда согласованное рукопожатие завершено. Некоторые протоколы могут не поддерживать несколько рукопожатий в существующем сокете и могут выбросить IOException.
- Throws:
-
IOException- при ошибке на сетевом уровне - See Also:
setUseClientMode
public abstract void setUseClientMode(boolean mode)
Этот метод должен быть вызван перед любым рукопожатием. После начала рукопожатия режим не может быть сброшен на протяжении всего срока действия этого сокета.
Серверы обычно аутентифицируют себя, а клиенты не обязаны этого делать.
- Parameters:
-
mode- true, если сокет должен начать рукопожатие в режиме "клиента" - Throws:
-
IllegalArgumentException- если попытка изменения режима выполняется после начала первоначального рукопожатия. - See Also:
getUseClientMode
public abstract boolean getUseClientMode()
- Returns:
- true, если сокет должен выполнять рукопожатие в режиме "клиента"
- See Also:
setNeedClientAuth
public abstract void setNeedClientAuth(boolean need)
Параметр аутентификации клиента сокета может быть одним из следующих:
- Требуется аутентификация клиента
- Запрашивается аутентификация клиента
- Аутентификация клиента не требуется
В отличие от setWantClientAuth(boolean), если этот параметр установлен, и клиент не предоставляет информацию об аутентификации, согласование прекращается, и соединение разрывается.
Вызов этого метода перезаписывает любое предыдущее значение, установленное этим методом или setWantClientAuth(boolean).
- Parameters:
-
need- установить в true, если требуется аутентификация клиента, или в false, если аутентификация клиента не требуется. - See Also:
getNeedClientAuth
public abstract boolean getNeedClientAuth()
- Returns:
- true, если требуется аутентификация клиента, или false, если аутентификация клиента не требуется.
- See Also:
setWantClientAuth
public abstract void setWantClientAuth(boolean want)
Параметр аутентификации клиента сокета может быть одним из следующих:
- Требуется аутентификация клиента
- Запрашивается аутентификация клиента
- Аутентификация клиента не требуется
В отличие от setNeedClientAuth(boolean), если этот параметр установлен, и клиент не предоставляет информацию об аутентификации, согласование продолжится.
Вызов этого метода перезаписывает любое предыдущее значение, установленное этим методом или setNeedClientAuth(boolean).
- Parameters:
-
want- установить в true, если запрашивается аутентификация клиента, или в false, если аутентификация клиента не требуется. - See Also:
getWantClientAuth
public abstract boolean getWantClientAuth()
- Returns:
- true, если запрашивается аутентификация клиента, или false, если аутентификация клиента не требуется.
- See Also:
setEnableSessionCreation
public abstract void setEnableSessionCreation(boolean flag)
- Parameters:
-
flag- true означает, что сессии могут быть созданы; это значение по умолчанию. false означает, что существующая сессия должна быть возобновлена - See Also:
getEnableSessionCreation
public abstract boolean getEnableSessionCreation()
- Возвращает:
- true означает, что сессии могут быть созданы; это значение по умолчанию. false означает, что необходимо возобновить существующую сессию
- См. также:
getSSLParameters
public SSLParameters getSSLParameters()
- Возвращает:
- параметры SSL, действующие для этого 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://download.java.net/java/early_access/jdk24/docs/api/java.base/javax/net/ssl/SSLSocket.html