java - 如何检测委托(delegate)任务中的异常(SSLEngine)

标签 java exception jsse sslengine

我将 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/

相关文章:

java - 我怎样才能得到一个 RejectedExecutionException

java - SocketChannel 的 write() 方法在应该抛出异常时却没有抛出异常

java - 使用 SSLEngine 在 NIO SSL 握手过程中抛出异常

java - 尝试发送到 SSLServerSocket 时出现 SSLSocket 异常握手错误

java - 在 Android 中获取电池电量和状态

java - Apache Camel : Call to . bean 未将对象保存在数据库中

java - 如何将主从主题从静态数据更改为动态数据?

java - 如果对象不可比较,如何使方法抛出异常?

java - java中的 keystore 密码加密

Java - 我无法查看预设 mysql 数据库中的表,但可以查看用户创建的数据库