在使用SSLEngine之前如何获取请求的域名?

How can I get the domain name of the request before using SSLEngine?

我想在 java 中获取域名,然后再确定我将使用哪个证书发回。我怎样才能做到这一点?

我需要自己分析字节吗?或者有这个图书馆吗?或者某些 java SSL 库可以做到吗?

相关post Extract Server Name Indication (SNI) from TLS client hello

但我希望只使用 java 库来获取主机名。

您在使用 SSLEngine. 之前不需要它 您在自定义 KeyManager 实现中需要它,在 chooseServerAlias() 方法中。您将需要通过下面列出的技术之一发现域名,然后创建您的 X509KeyManager 实现,适当配置以便 return 适当的密钥库别名,然后构造一个 SSLContext, 初始化它与您的 KeyManager,然后构建您的 SSLEngine. 在握手期间,引擎将调用您的密钥管理器。

  1. SNI。如果客户端支持 SNI,您可以从初始 ClientHello 消息中获取域名,如您的 link 所示。您需要在解析后将 ByteBuffer 恢复到之前的状态,以便 SSLEngine 也可以解析它。

  2. 否则,您依赖于每个域的不同 IP 地址。你必须已经有一个 SocketChannel, 所以你已经知道连接的目标地址,即客户端用来通过 SocketChannel.getLocalAddress() 连接到你的地址,所以你所能做的就是映射域名如果您的域具有不同的 IP 地址。

很莫名其妙,这不可能直接用SSLEngine来做。

我自己也遇到了同样的问题,最后写了一个库 (TLS Channel)。它不仅如此,它实际上是 SSLEngine 的完整抽象,作为 ByteChannel 公开。关于 SNI,可以向服务器通道提供一个函数,根据提供的域名 select SSLContexts。