在使用客户端证书时,WebSocketServer SSL 手shake 会卡死
**描述错误** 当使用生成需要客户端证书验证的 ServerSockets 的 WebSocketServerFactory 来设置 WebSocketServer 时,如果客户端具有有效的客户端证书,则 WebSocketServer 在手shake 过程中会卡住。 到目前为止,我已经弄清楚了以下情况: SSLSocketChannel2 中的代码似乎卡住了,因为最后一次读取(可能返回客户端证书)使 SSLEngine 进入 NEED_TASK 状态(可能是为了验证证书),而任务使 SSLEngine 进入 NEED_UNWRAP 状态。 但是,由于没有更多的数据可读,因此没有进一步调用 unwrap() 来完成手shake。 请注意,当客户端证书无效时,手shake 将被正确拒绝。 通过修改 SSLSocketChannel2 使其在 consumeDelegatedTasks() 中同步执行任务,并在任务执行后检查此状态并调用 sslEngine#unwrap() 来完成手shake,但我认为这不是一个合适的解决方案。 遗憾的是,我对代码的理解不够深入,无法提出合适的解决方案。 **要重现** 重现行为的步骤: 1. 使用生成需要客户端证书的 ServerSockets 的 WebSocketServerFactory 来设置 WebSocketServer,并使用一个信任存储来设置一个客户端根证书的 SSLContext。 2. 使用生成具有由根证书签名的有效客户端证书的 SSLContext 的 WebSocketServerFactory 来连接 WebSocketClient。 3. 尝试将 WebSocketClient 连接到 WebSocketServer。 4. 发现手shake 从未完成。 **重现问题的示例应用程序** N/A **预期行为** 如果客户端发送了有效的身份验证证书,则 SSL 手shake 应该成功完成。 **调试日志** N/A **环境(请填写以下信息)** - 使用的版本: 1.6.0 - Java 版本: 8 - 操作系统和版本: MacOS Tahoe 26.2 - 端点名称和版本: N/A - 链接到您的项目: N/A **其他上下文** N/A
内容来源: TooTallNate/Java-WebSocket