1

根据SSLSocket 上的文档

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

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

4

1 回答 1

2

在 上开始握手有 3 个条件SSLSocket

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

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

如果由于某种原因握手失败,SSLSocket 将关闭,并且无法进行进一步的通信。

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

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

如果数据已在连接上发送,则在此握手期间继续传输。

于 2012-05-03T18:55:51.493 回答