Как обнаружить исключения в делегированных задачах (SSLEngine)

Я использую SSLEngines вместе с NIO для обеспечения неблокирующих SSL-соединений с моим приложением. В какой-то момент во время рукопожатия (вероятно, после получения ServerHelloDone) SSLEngine требует, чтобы я обработал делегированную задачу.

Поэтому я вызываю getDelegatedTask и вызываю его метод run. Сама задача вызывает X509ExtendedKeyManager.getCertificateChain, который, в свою очередь, выдает NullPointerException. Это исключение перехватывается Handshaker и сохраняется для последующих отчетов.

Однако отчеты работают, вызывая закрытый метод checkTaskThrown, который вызывается только тогда, когда сообщение было получено или сообщение должно быть отправлено. Но без корректного завершения getCertificateChain отправлять нечего, и другая сторона тоже ничего не отправляет, поэтому и получать нечего. Следовательно, исключение остается скрытым.

Поскольку ни одна из сторон не продвигается вперед, у нас есть живой замок. И я не нашел способа предотвратить или обнаружить это, кроме

  • Использование отражения для вызова checkTaskThrown
  • Используйте какую-нибудь задачу/таймер для тайм-аута

Ни тот, ни другой путь я не хочу пройти...


person Steffen Heil    schedule 06.10.2015    source источник
comment
Когда задача завершится, вы должны повторить операцию, которая вернула NEED_TASK. Но почему он генерирует исключение NullPointerException?   -  person user207421    schedule 14.10.2015
comment
Вы были на самом деле правы. Мой код на самом деле вызвал getHandshakeStatus и получил NEED_UNWRAP, но, поскольку в sourceByteBuffer ничего не было, внутренняя оптимизация меня укусила, и unwrap не вызывался. Пожалуйста, сделайте репост своего комментария как ответ.   -  person Steffen Heil    schedule 20.10.2015


Ответы (1)


Когда задача завершится, вы должны повторить операцию, которая вернула NEED_TASK.

Вам нужно найти и исправить NPE в вашем KeyManager.

person user207421    schedule 11.02.2016