2015-10-06 5 views
0

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

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

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

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

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

Ни один из которых является маршрут, я хочу идти ...

+0

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

+0

Ты был прав. Мой код действительно называл 'getHandshakeStatus' и получил' NEED_UNWRAP', но поскольку в 'sourceByteBuffer'е ничего не было, внутренняя оптимизация бит меня и' разворот' не вызывалась. Пожалуйста, отправьте комментарий в ответ. –

ответ

1

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

Вам необходимо найти и исправить NPE в своем KeyManager.