Я использую SSLEngine
s вместе с NIO для обеспечения неблокирующих SSL-соединений с моим приложением. В какой-то момент во время рукопожатия (вероятно, после получения ServerHelloDone
) SSLEngine
требует, чтобы я обработал делегированную задачу.
Поэтому я вызываю getDelegatedTask
и вызываю его метод run
. Сама задача вызывает X509ExtendedKeyManager.getCertificateChain
, который, в свою очередь, выдает NullPointerException
. Это исключение перехватывается Handshaker
и сохраняется для последующих отчетов.
Однако отчеты работают, вызывая закрытый метод checkTaskThrown
, который вызывается только тогда, когда сообщение было получено или сообщение должно быть отправлено. Но без корректного завершения getCertificateChain
отправлять нечего, и другая сторона тоже ничего не отправляет, поэтому и получать нечего. Следовательно, исключение остается скрытым.
Поскольку ни одна из сторон не продвигается вперед, у нас есть живой замок. И я не нашел способа предотвратить или обнаружить это, кроме
- Использование отражения для вызова
checkTaskThrown
- Используйте какую-нибудь задачу/таймер для тайм-аута
Ни тот, ни другой путь я не хочу пройти...
getHandshakeStatus
и получилNEED_UNWRAP
, но, поскольку вsourceByteBuffer
ничего не было, внутренняя оптимизация меня укусила, иunwrap
не вызывался. Пожалуйста, сделайте репост своего комментария как ответ. - person Steffen Heil   schedule 20.10.2015