根据SSLSocket上的文档:
您可以注册以接收握手事件通知 完成。
你为什么不注册这个? SSLSocket.startHandshake(( 在没有发生 SSL 交互的情况下成功的事实是否确保证书是可信的? 或者您是否通过等待握手完成来获得一些额外的保证?
SSLSocket
上开始握手有 3 个条件:
调用开始握手
- ,显式开始握手,或
- 在此套接字上读取或写入应用程序数据的任何尝试都会导致隐式握手,或者
- 如果当前没有有效的会话,则对 getSession 的调用会尝试设置会话,并且会进行隐式握手。
任何握手失败都会生成异常(包括证书不受信任的情况(:
如果握手因任何原因失败,则 SSLSocket 将关闭,并且不会 可以进行更进一步的通信。
通常,在建立连接时显式调用startHandshake()
是不必要的,因为握手是在开始从输入流读取(或写入输出流(时启动的。任何故障都会导致异常并停止正常的控制流。在这些情况下,无需显式注册即可捕获握手的完成情况:如果可以从流中读取/写入,则已完成。
如果您是请求重新协商的服务器(通过在某些应用程序数据交换后调用startHandshake()
(,握手完成通知最有用。在这种情况下,您可能需要等待握手完成,然后再继续。例如,如果服务器在收到特定路径的 HTTP 请求后请求客户端证书,则在发送响应之前,它可能希望等待握手成功完成以便能够授权客户端证书。这是因为startHandshake()
不会停止应用程序数据流:
如果数据已在连接上发送,则数据将继续流动 在这次握手中。