Класс 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
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
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
Если существует менеджер безопасности, его метод 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 спецификации Java Security Standard Algorithm Names, и также может включать другие наборы шифрования, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифрования
- См. также:
getEnabledCipherSuites
public abstract String[] getEnabledCipherSuites()
Обратите внимание, что даже если набор включён, он может никогда не использоваться. Это может произойти, если удалённый узел его не поддерживает, или его использование ограничено, или необходимые сертификаты (и закрытые ключи) для набора недоступны, или анонимный набор включён, но требуется проверка подлинности.
Возвращаемый массив включает наборы шифрования из списка стандартных имён наборов шифрования в разделе Имена наборов шифрования JSSE спецификации Java Security Standard Algorithm Names, и также может включать другие наборы шифрования, которые поддерживает поставщик.
- Возвращает:
- массив имён наборов шифрования
- См. также:
setEnabledCipherSuites
public abstract void setEnabledCipherSuites(String[] suites)
Каждый набор шифрования в параметре suites должен был быть перечислен в getSupportedCipherSuites(), иначе метод завершится ошибкой. После успешного вызова этого метода для использования будут включены только наборы, перечисленные в параметре suites.
Обратите внимание, что стандартный список имён наборов шифрования можно найти в разделе Имена наборов шифрования JSSE спецификации Java Security Standard Algorithm Names. Поставщики могут поддерживать имена наборов шифрования, не представленные в этом списке, или могут не использовать рекомендуемое имя для определённого набора шифрования.
См. 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 (Application-Layer Protocol Negotiation), могут согласовывать значения на уровне приложения между узлами.
- Требования к реализации:
- Реализация в этом классе выбрасывает
UnsupportedOperationExceptionи не выполняет никаких других действий. - Возвращает:
- null, если еще не определено, будут ли использоваться протоколы приложения для этого соединения; пустую строку, если протоколы приложения не будут использоваться, или ненулевое значение протокола приложения, если значение было успешно согласовано.
- Исключение:
-
UnsupportedOperationException- если базовый поставщик не реализует операцию. - С:
- 9
getHandshakeApplicationProtocol
public String getHandshakeApplicationProtocol()
Как и getHandshakeSession(), соединение может быть в середине рукопожатия. Протокол приложения может или может еще не быть доступен.
- Требования к реализации:
- Реализация в этом классе выбрасывает
UnsupportedOperationExceptionи не выполняет никаких других действий. - Возвращает:
- null, если еще не определено, будут ли использоваться протоколы приложения для этого рукопожатия; пустую строку, если протоколы приложения не будут использоваться, или ненулевое значение протокола приложения, если значение было успешно согласовано.
- Исключение:
-
UnsupportedOperationException- если базовый поставщик не реализует операцию. - С:
- 9
setHandshakeApplicationProtocolSelector
public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector)
SSLParameters.setApplicationProtocols, и поддерживает следующие типы параметров: Например, следующий вызов регистрирует функцию обратного вызова, которая анализирует параметры рукопожатия TLS и выбирает имя протокола приложения:
SSLSocket- Первый аргумент функции позволяет проверить текущие
SSLSocket, включая сеанс рукопожатия и параметры конфигурации.List<String>- Второй аргумент функции перечисляет имена протоколов приложения, объявленные узлом TLS.
String- Результатом функции является имя протокола приложения или null, чтобы указать, что ни одно из объявленных имен не подходит. Если возвращаемое значение — пустая строка, то указания протоколов приложения не будут использоваться. Если возвращаемое значение равно 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, 2023, 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/21/docs/api/java.base/javax/net/ssl/SSLSocket.html