Класс 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() |
Возвращает параметры 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() |
Запускает рукопожатие для этого SSLSocket. |
Методы, объявленные в классе Socket
bind, close, connect, connect, getChannel, getInetAddress, getInputStream, getKeepAlive, getLocalAddress, getLocalPort, getLocalSocketAddress, getOOBInline, getOption, getOutputStream, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoLinger, getSoTimeout, getTcpNoDelay, getTrafficClass, isBound, isClosed, isConnected, isInputShutdown, isOutputShutdown, sendUrgentData, setKeepAlive, setOOBInline, setOption, setPerformancePreferences, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSocketImplFactory, setSoLinger, setSoTimeout, setTcpNoDelay, setTrafficClass, shutdownInput, shutdownOutput, supportedOptions, toString | Модификатор и тип | Метод | Описание |
|---|---|---|
void |
bind |
Привязывает сокет к локальному адресу. |
void |
close() |
Закрывает этот сокет. |
void |
connect |
Подключает этот сокет к серверу. |
void |
connect |
Подключает этот сокет к серверу с заданным значением времени ожидания. |
SocketChannel |
getChannel() |
Возвращает уникальный объект SocketChannel, связанный с этим сокетом, если такой объект существует. |
InetAddress |
getInetAddress() |
Возвращает адрес, к которому подключён сокет. |
InputStream |
getInputStream() |
Возвращает входной поток для этого сокета. |
boolean |
getKeepAlive() |
Проверяет, включён ли параметр SO_KEEPALIVE. |
InetAddress |
getLocalAddress() |
Получает локальный адрес, к которому привязан сокет. |
int |
getLocalPort() |
Возвращает номер локального порта, к которому привязан этот сокет. |
SocketAddress |
getLocalSocketAddress() |
Возвращает адрес конечной точки, к которой привязан этот сокет. |
boolean |
getOOBInline() |
Проверяет, включён ли параметр SO_OOBINLINE. |
<T> T |
getOption |
Возвращает значение параметра сокета. |
OutputStream |
getOutputStream() |
Возвращает выходной поток для этого сокета. |
int |
getPort() |
Возвращает номер удалённого порта, к которому подключён этот сокет. |
int |
getReceiveBufferSize() |
Получает значение параметра SO_RCVBUF для этого Socket, то есть размер буфера, используемого платформой для ввода данных через этот Socket. |
SocketAddress |
getRemoteSocketAddress() |
Возвращает адрес конечной точки, к которой подключён этот сокет, или null, если он не подключён. |
boolean |
getReuseAddress() |
Проверяет, включён ли параметр SO_REUSEADDR. |
int |
getSendBufferSize() |
Получает значение параметра SO_SNDBUF для этого Socket, то есть размер буфера, используемого платформой для вывода данных через этот Socket. |
int |
getSoLinger() |
Возвращает значение параметра SO_LINGER. Возвращаемое значение -1 означает, что параметр отключён. |
int |
getSoTimeout() |
Возвращает значение параметра SO_TIMEOUT. Возвращаемое значение 0 означает, что параметр отключён (то есть время ожидания не ограничено). |
boolean |
getTcpNoDelay() |
Проверяет, включён ли параметр TCP_NODELAY. |
int |
getTrafficClass() |
Получает класс трафика или тип обслуживания в заголовке IP для пакетов, отправляемых этим сокетом. |
boolean |
isBound() |
Возвращает состояние привязки сокета. |
boolean |
isClosed() |
Возвращает состояние закрытия сокета. |
boolean |
isConnected() |
Возвращает состояние соединения сокета. |
boolean |
isInputShutdown() |
Возвращает true, если чтение из сокета было отключено. |
boolean |
isOutputShutdown() |
Возвращает true, если запись в сокет была отключена. |
void |
sendUrgentData |
Отправляет один байт срочных данных через сокет. |
void |
setKeepAlive |
Включает или отключает параметр SO_KEEPALIVE. |
void |
setOOBInline |
Включает или отключает параметр SO_OOBINLINE (получение срочных данных TCP). По умолчанию этот параметр отключён, и полученные через сокет срочные данные TCP молча отбрасываются. |
<T> Socket |
setOption |
Задаёт значение параметра сокета. |
void |
setPerformancePreferences |
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии. Этот метод предназначался для поддержки протоколов, которые теперь устарели. |
void |
setReceiveBufferSize |
Задаёт для этого Socket указанное значение параметра SO_RCVBUF. |
void |
setReuseAddress |
Включает или отключает параметр сокета SO_REUSEADDR. |
void |
setSendBufferSize |
Задаёт для этого Socket указанное значение параметра SO_SNDBUF. |
static void |
setSocketImplFactory |
Устарело. Используйте SocketFactory и напрямую создайте подкласс Socket. |
void |
setSoLinger |
Включает или отключает параметр SO_LINGER, задавая время ожидания в секундах. |
void |
setSoTimeout |
Включает или отключает параметр SO_TIMEOUT, задавая время ожидания в миллисекундах. |
void |
setTcpNoDelay |
Включает или отключает параметр TCP_NODELAY (отключает или включает алгоритм Нейгла). |
void |
setTrafficClass |
Задаёт класс трафика или октет типа обслуживания в заголовке IP для пакетов, отправляемых этим сокетом. |
void |
shutdownInput() |
Отключает чтение из соединения, не закрывая сокет. |
void |
shutdownOutput() |
Отключает запись в соединение, не закрывая сокет. |
Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим сокетом. |
String |
toString() |
Преобразует этот сокет в String. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии. Финализация устарела и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного периода реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного периода реального времени. |
Подробное описание конструкторов
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— прослушиватель события HandShake Completed - Исключения:
-
IllegalArgumentException— если аргумент равен null. - См. также:
removeHandshakeCompletedListener
public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
- Параметры:
-
listener— прослушиватель события HandShake Completed - Исключения:
-
IllegalArgumentException— если прослушиватель не зарегистрирован или аргумент равен null. - См. также:
startHandshake
public abstract void startHandshake() throws IOException
SSLSocket. К распространённым причинам относятся необходимость инициировать новый защищённый сеанс, создать новые ключи шифрования или изменить наборы шифров. Чтобы принудительно выполнить полную повторную аутентификацию, перед запуском этого рукопожатия следует аннулировать текущий сеанс.
Поведение этого метода зависит от протокола (и, возможно, реализации). Например, в TLSv1.3 вызов этого метода после установления подключения инициирует обновление ключа. В предыдущих версиях TLS он инициирует повторное согласование (повторное рукопожатие).
Если по подключению уже передавались данные, их передача продолжается во время этого рукопожатия. После завершения рукопожатия будет отправлено уведомление о событии.
Для начального рукопожатия в подключении этот метод является синхронным и возвращает управление после завершения согласования. Некоторые протоколы могут не поддерживать несколько рукопожатий в существующем сокете и могут вызвать 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.