Класс 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 {code 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:
- Когда соединение больше не нужно, клиенты и серверы должны каждый закрыть обе стороны своего соответствующего соединения. Для
SSLSocketобъектов, например, приложение может вызватьSocket.shutdownOutput()илиOutputStream.close()для закрытия потока вывода и вызватьSocket.shutdownInput()илиInputStream.close()для закрытия потока ввода. Обратите внимание, что в некоторых случаях закрытие потока ввода может зависеть от закрытия потока вывода партнёром. Если соединение не закрывается в порядке (например,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<SSLSocket, |
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
Если существует менеджер безопасности, его метод checkConnect вызывается с адресом хоста и port в качестве аргументов. Это может привести к SecurityException.
- Параметры:
-
host- имя хоста, с которым нужно подключиться, илиnullдля адреса обратной петли. -
port- номер порта сервера - Исключения:
-
IOException- если при создании сокета произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckConnectне разрешает операцию. -
UnknownHostException- если хост неизвестен -
IllegalArgumentException- если параметр порта находится вне указанного диапазона допустимых значений портов, который составляет от 0 до 65535 включительно. - См. также:
SSLSocket
protected SSLSocket(InetAddress address, int port) throws IOException
Если существует менеджер безопасности, его метод checkConnect вызывается с адресом хоста и port в качестве аргументов. Это может привести к SecurityException.
- Параметры:
-
address- хост сервера -
port- его порт - Исключения:
-
IOException- если при создании сокета произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckConnectне разрешает операцию. -
IllegalArgumentException- если параметр порта находится вне указанного диапазона допустимых значений портов, который составляет от 0 до 65535 включительно. -
NullPointerException- еслиaddressравно null. - См. также:
SSLSocket
protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
Если существует менеджер безопасности, его метод checkConnect вызывается с адресом хоста и port в качестве аргументов. Это может привести к SecurityException.
- Параметры:
-
host- имя хоста, с которым нужно подключиться, илиnullдля адреса обратной петли. -
port- номер порта сервера -
clientAddress- адрес клиента, к которому привязывается сокет, илиnullдляanyLocalадреса. -
clientPort- порт клиента, к которому привязывается сокет, илиzeroдля выбора свободного порта системой. - Исключения:
-
IOException- если при создании сокета произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckConnectне разрешает операцию. -
UnknownHostException- если хост неизвестен -
IllegalArgumentException- если параметр порта или clientPort находится вне указанного диапазона допустимых значений портов, который составляет от 0 до 65535 включительно. - См. также:
SSLSocket
protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
Если существует менеджер безопасности, его метод checkConnect вызывается с адресом хоста и port в качестве аргументов. Это может привести к SecurityException.
- Параметры:
-
address- хост сервера -
port- его порт -
clientAddress- адрес клиента, к которому привязывается сокет, илиnullдляanyLocalадреса. -
clientPort- порт клиента, к которому привязывается сокет, илиzeroдля выбора свободного порта системой. - Исключения:
-
IOException- если при создании сокета произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckConnectне разрешает операцию. -
IllegalArgumentException- если параметр порта или clientPort находится вне указанного диапазона допустимых значений портов, который составляет от 0 до 65535 включительно. -
NullPointerException- еслиaddressравно null. - См. также:
Подробное описание методов
getSupportedCipherSuites
public abstract String[] getSupportedCipherSuites()
Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе JSSE Cipher Suite Names документации Java Cryptography Architecture Standard Algorithm Name, и также может включать другие наборы шифрования, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифрования
- См. также:
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()
Обратите внимание, что даже если набор шифрования включён, он может никогда не использоваться. Это может произойти, если его не поддерживает удалённая сторона, или его использование ограничено, или необходимые сертификаты (и закрытые ключи) для набора шифрования недоступны, или анонимный набор шифрования включён, но требуется аутентификация.
Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе JSSE Cipher Suite Names документации Java Cryptography Architecture Standard Algorithm Name, и также может включать другие наборы шифрования, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифрования
- См. также:
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites)
Каждый набор шифрования в параметре suites должен был быть перечислен в getSupportedCipherSuites(), иначе метод завершится ошибкой. После успешного вызова этого метода, только наборы шифрования, перечисленные в параметре suites будут включены для использования.
Обратите внимание, что стандартный список имён наборов шифрования можно найти в разделе JSSE Cipher Suite Names документации Java Cryptography Architecture Standard Algorithm Name. Поставщики могут поддерживать имена наборов шифрования, которые не указаны в этом списке, или могут не использовать рекомендуемое имя для определённого набора шифрования.
См. getEnabledCipherSuites() для получения дополнительной информации о том, почему конкретный набор шифрования может никогда не использоваться в соединении.
- Параметры:
-
suites- Имена всех наборов шифрования, которые нужно включить - Исключения:
-
IllegalArgumentException- если один или несколько шифров, указанных в параметре, не поддерживаются, или если параметр равен null. - См. также:
getSupportedProtocols
public abstract String[] getSupportedProtocols()
- Возвращает:
- массив поддерживаемых протоколов
getEnabledProtocols
public abstract String[] getEnabledProtocols()
Обратите внимание, что даже если протокол включён, он может никогда не использоваться. Это может произойти, если удалённая сторона не поддерживает протокол, или его использование ограничено, или нет включенных наборов шифрования, поддерживаемых протоколом.
- Возвращает:
- массив протоколов
- См. также:
setEnabledProtocols
public abstract void setEnabledProtocols(String[] protocols)
Протоколы должны быть перечислены в getSupportedProtocols() как поддерживаемые. После успешного вызова этого метода, для использования будут разрешены только протоколы, перечисленные в параметре protocols.
- Parameters:
-
protocols- Имена всех протоколов, которые нужно включить. - Throws:
-
IllegalArgumentException- если один или несколько протоколов, указанных в параметре, не поддерживаются или если параметр protocols равен null. - See Also:
getSession
public abstract SSLSession getSession()
Этот метод инициирует начальный обмен данными, если необходимо, и затем блокируется до тех пор, пока обмен не будет завершён.
Если при начальном обмене данными возникнет ошибка, этот метод возвращает недопустимый объект сессии, который сообщает о недопустимом наборе шифров "SSL_NULL_WITH_NULL_NULL".
- Returns:
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()
- Возвращает:
- 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, 2021, 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/17/docs/api/java.base/javax/net/ssl/SSLSocket.html