我将 SSLEngine
与 NIO 一起使用,为我的应用程序提供非阻塞 SSL 连接。在握手期间的某个时刻(可能是在收到 ServerHelloDone
之后),SSLEngine
要求我处理委托(delegate)的任务。
因此,我调用 getDelegateTask
并调用它的 run
方法。任务本身调用 X509ExtendedKeyManager.getCertificateChain
,这又会引发 NullPointerException
。该异常由 Handshaker
捕获并存储以供以后报告。
但是,报告是通过调用私有(private) checkTaskThrown
方法来工作的,该方法仅在收到消息或要发送消息时调用。
但是,如果 getCertificateChain
无法正确完成,则无法发送任何内容,而另一方也无法发送任何内容,因此也无法接收任何内容。因此,异常保持隐藏状态。
由于没有一方继续进行,我们陷入了活锁。 我发现没有办法阻止或检测这种情况,除了
- 使用反射调用
checkTaskThrown
- 使用一些任务/计时器来超时
哪条路都不是我想要走的路...
最佳答案
任务完成后,您应该重试返回 NEED_TASK 的操作。
您需要在KeyManager 中查找并修复 NPE。
关于java - 如何检测委托(delegate)任务中的异常(SSLEngine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32974249/