注册接收SSLSocket握手完成的事件通知

时间:2012-05-03 18:43:32

标签: java ssl handshake jsse

根据documentation on SSLSocket

  

您可以注册接收握手的事件通知   完成。

你为什么不注册这个? SSLSocket.startHandshake()在没有发生SSLException的情况下成功的事实是否确保证书可信?或者通过等待握手完成来获得一些额外的保证?

1 个答案:

答案 0 :(得分:2)

SSLSocket上启动握手有三个条件:

  
      
  • 调用startHandshake明确开始握手,或
  •   
  • 在此套接字上读取或写入应用程序数据的任何尝试都会导致隐式握手,或
  •   
  • 如果没有当前有效的会话,则调用getSession会尝试建立会话,并完成隐式握手。
  •   

任何握手失败都会产生异常(包括证书不受信任时):

  

如果由于任何原因握手失败,SSLSocket将关闭,否则   进一步的沟通可以做到。

通常,在建立连接时显式调用startHandshake()是不必要的,因为当您从输入流开始读取(或写入输出流)时会启动握手。任何失败都会导致异常并停止正常的控制流程。在这些情况下,您无需显式注册以捕获握手的完成情况:如果您可以从流中读取/写入,则已完成。

如果您是要求重新协商的服务器(通过在交换某些应用程序数据后调用startHandshake()),则握手完成通知非常有用。在这种情况下,您可能希望在继续之前等待该握手完成。例如,如果服务器在收到特定路径的HTTP请求后请求客户端证书,则可能希望在发送响应之前等待握手成功完成以便能够授权客户端证书。这是因为startHandshake()不会停止应用程序数据的流动:

  

如果已经在连接上发送了数据,它将继续流动   在握手期间。