处理 SSL 客户端到服务器到客户端(中继?)的最佳方式

Best way to handle SSL client to server to client (relay?)

我正在尝试加密从客户端 1 到客户端 2 的消息,但无法通过点对点完成;因为动态 IP 问题。

我决定使用中央服务器,但我不确定服务器是否应该只中继 SSL 握手以及之后的任何后续加密消息(从客户端 1 到客户端 2)。我想到的另一种选择是让服务器将client2的IP提供给client1,并让client1发起直接连接,直接进行SSL握手。

或者也许有更好的方法?

以下是我拟定的 2 个流程:

在两个客户端之间使用直接连接,使用服务器来促进 IP 发现,是可能的最佳选择。 Client1 可以尝试连接到 Client2,如果失败则客户端可以切换角色并让 Client2 尝试连接到 Client1。

以防无法在任一方向建立直接连接(例如两个客户端都在 routers/firewalls 后面阻塞连接,常用的 NAT 打洞技术无法打开它们) ,那么服务器可以充当中继,类似于网络浏览器在配置为使用代理服务器时仍然可以连接到 HTTPS 服务器的方式。只要服务器按原样依赖 SSL 消息,并且客户端不验证 TCP 数据包的源 IP 地址,那么它就可以工作。

但是,如果客户端正在验证源地址,则每个客户端都必须在其自身与服务器之间建立单独的 SSL 会话,其中客户端 1 将加密数据发送到服务器,服务器解密数据并重新加密发送给Client2时,反之亦然。