Регистрация для получения уведомления о завершении рукопожатия SSLSocket

Согласно документации по SSLSocket:

Вы можете зарегистрироваться, чтобы получать уведомления о завершении рукопожатия.

Почему бы вам не зарегистрироваться для этого? Гарантирует ли тот факт, что SSLSocket.startHandshake() успешно выполняется без возникновения SSLException, что сертификатам доверяют? Или вы получаете дополнительный уровень уверенности, ожидая завершения рукопожатия?


person Paul Reiners    schedule 03.05.2012    source источник


Ответы (1)


Есть 3 условия для начала рукопожатия на SSLSocket :

  • вызов startHandshake, который явно начинает рукопожатия, или
  • любая попытка чтения или записи данных приложения в этот сокет вызывает неявное рукопожатие или
  • вызов getSession пытается установить сеанс, если в настоящее время нет действительного сеанса, и выполняется неявное рукопожатие.

Любой сбой рукопожатия будет генерировать исключение (в том числе, когда сертификат не является доверенным):

Если рукопожатие по какой-либо причине не удается, SSLSocket закрывается, и дальнейшая связь невозможна.

Часто явный вызов startHandshake() при установлении соединения не нужен, так как рукопожатие инициируется, когда вы начинаете чтение из входного потока (или запись в выходной поток). Любой сбой вызовет исключение и остановит нормальный поток управления. В этих случаях вам не нужно явно регистрироваться, чтобы зафиксировать завершение рукопожатия: если вы можете читать/записывать из потоков, это сделано.

Уведомление о завершении рукопожатия в основном полезно, если вы являетесь сервером, запрашивающим повторное согласование (путем вызова startHandshake() после обмена некоторыми данными приложения). В этом случае вы можете дождаться завершения этого рукопожатия, прежде чем продолжить. Например, если сервер запрашивает сертификат клиента после получения HTTP-запроса для определенного пути, он может захотеть дождаться успешного завершения рукопожатия, чтобы иметь возможность авторизовать сертификат клиента, прежде чем отправлять ответ. Это связано с тем, что startHandshake()< /a> не останавливает поток данных приложения:

Если данные уже были отправлены по соединению, они продолжают передаваться во время этого рукопожатия.

person Bruno    schedule 03.05.2012
comment
Похоже, что сервер должен кэшировать данные, которые отправляет клиент, до завершения рукопожатия. Кажется, это вызывает проблемы, потому что кеш веб-сервера Apache по умолчанию составляет ~ 128 КБ, а HTTP PUT файла может быть огромным ... - person Ryan; 11.01.2013
comment
@Ryan Нет. Сервер не получает данные, которые отправляет клиент, до завершения рукопожатия. Пока рукопожатие не завершится, нет соединения, по которому можно отправлять данные. - person user207421; 19.11.2013
comment
@Ryan Если и только если ранее было рукопожатие. Если этого не произошло, рукопожатие должно быть завершено до отправки каких-либо данных. Я имею в виду тот случай («нет связи»). - person user207421; 23.05.2016