В документации SSLEngine указано, как правильно закрыть соединение SSL. В частности, он дает инструкции о том, как обращаться с разорванным соединением:
В дополнение к обычным отключениям также могут быть неупорядоченные отключения, при которых транспортный канал разрывается до обмена сообщениями о закрытии. В предыдущих примерах приложение могло получить -1 при попытке чтения или записи в неблокирующий SocketChannel. Когда вы дойдете до конца ваших входных данных, вы должны вызвать engine.closeInbound(), который проверит с помощью SSLEngine, что удаленный одноранговый узел закрылся правильно с точки зрения SSL/TLS, а затем приложение все еще должно попытаться завершить работу корректно. с помощью описанной выше процедуры.
По сути, если ссылка разорвана, следует вызвать engine.closeInbound()
. Однако документация этого closeInbound() указывает, что он вызовет исключение, если он будет вызван до получения надлежащего закрывающего сообщения от однорангового узла. Мне кажется, что если соединение разорвано, это сообщение close_notify никогда не будет получено, поэтому этот метод всегда будет выдавать это исключение.
Я сделал тест, сделал простую процедуру выключения, где socketChannel.read()
возвращает -1, я вызываю engine.closeInbound()
и действительно получаю следующее исключение:
javax.net.ssl.SSLException: Inbound closed before receiving peer's close_notify: possible truncation attack?
Что мне не хватает? Разве эти 2 части документации не противоречат друг другу?