SSL:如何使用连接到同一端口的单独密钥处理多个客户端?

SSL: How to handle multiple clients with separate keys connecting to the same port?

这里有另一个遗留支持问题!
我们有一个服务器多客户端网络,其中每个组件都有一个自签名证书并添加到 server/client 的信任库中。我们这里没有使用证书颁发机构。
现在我们的问题是我们需要升级所有证书以获得更好的安全性。新的客户端将带有更新的证书,甚至服务器也会有新的证书。
我们的问题是如何处理老客户。升级我们老客户的密钥库是最后的手段。

无效的事情:

  1. 在服务器信任库中同时添加新旧证书:即使客户端正在验证服务器,服务器证书也不会出现在客户端信任库中。

  2. 为新客户端使用新端口:我们考虑过为新客户端使用新端口并为旧客户端继续使用旧端口,但问题是有多个应用程序面临这个问题,所以我们将不得不搜索其他产品未使用的多个新端口。

FWIW:服务器使用 Java,客户端使用 C++

在 EJP 回答后编辑
我可能在这里问了一个非常愚蠢的问题,但只是想确定一下。一旦绑定套接字,就绝对没有办法编辑套接字的 SSL 上下文。正确吗?
另外,我们可以选择握手时使用的服务器证书吗?我知道 chooseClientAlias()chooseServerAlias() 方法,但在这里我们不知道要使用哪个证书,直到发送客户端 Hello 消息。

撇开使用不同的端口不谈:

  1. (1) 将在服务器与客户端证书相关的范围内工作。
  2. 除了升级客户端信任库之外, 无法让旧客户端识别新服务器证书。

这就是为什么您应该使用 CA,甚至是内部 CA,以及为什么您 绝对不能 再次犯同样的错误。如果客户端直接信任 CA 而不是自签名服务器证书,那么您现在不会遇到这个问题,将来也不会遇到,无论您升级证书多少次,直到 CA 证书过期,这应该需要20年。

在您进行操作时,请确保您构建的方式能够更新客户端信任库。

There is absolutely no way to edit the SSL Context of a socket once it is bound. Correct?

SSLContext 一旦 初始化 就无法编辑,这先于创建套接字,更不用说绑定它们了。嗯,也许你可以重新加载 KeyManagerTrustManager 而只是不告诉 SSLContext,但我并不是说它会(或不会)起作用。

Also, can we choose the server certificate to be used during the handshake?

是的,这就是 KeyManager 界面的用途,特别是 chooseServerAlias()

I know of chooseClientAlias() and chooseServerAlias() methods but here we don't know which certificate to use till the client Hello message is sent.

chooseServerAlias 在收到 ClientHello 之前不会被调用。