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

时间:2016-02-10 03:33:14

标签: java ssl sslengine

我想在确定将用于发回的证书之前在java中获取域名。我怎样才能做到这一点?

我是否需要以某种方式分析字节?或者有一个图书馆吗?或者一些java SSL lib能做到吗?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  2. 否则,您依赖于每个域的IP地址不同。您必须已经拥有SSLEngine,因此您已经通过SocketChannel,了解了连接的目标地址,即客户端用于连接您的地址,因此您所能做的就是映射域名来自如果您的域名具有不同的IP地址。

答案 1 :(得分:1)

相当难以解释,这是不可能直接用SSLEngine做的。

我自己遇到了同样的问题,最后写了一个库(TLS Channel)。它不仅如此,它实际上是SSLEngine的完全抽象,暴露为ByteChannel。关于SNI,可以向服务器通道提供一个功能,根据提供的域名选择SSLContexts。