我想在确定将用于发回的证书之前在java中获取域名。我怎样才能做到这一点?
我是否需要以某种方式分析字节?或者有一个图书馆吗?或者一些java SSL lib能做到吗?
相关帖子 Extract Server Name Indication (SNI) from TLS client hello
但我希望只使用java库来获取主机名。
答案 0 :(得分:1)
在使用SSLEngine.
之前,您不需要它在KeyManager
方法的自定义chooseServerAlias()
实现中需要它。您需要通过下面列出的技术之一发现域名,然后创建适当配置的X509KeyManager
实现,以便返回相应的密钥库别名,然后使用您的{构建SSLContext,
初始化它{1}},然后构建您的KeyManager
在握手期间,引擎会调用您的密钥管理器。
SNI。如果客户端支持SNI,您可以从链接中显示的初始SSLEngine.
消息中获取域名。解析后,您需要将ClientHello
恢复到之前的状态,以便ByteBuffer
也可以解析它。
否则,您依赖于每个域的IP地址不同。您必须已经拥有SSLEngine
,因此您已经通过SocketChannel,
了解了连接的目标地址,即客户端用于连接您的地址,因此您所能做的就是映射域名来自如果您的域名具有不同的IP地址。
答案 1 :(得分:1)
相当难以解释,这是不可能直接用SSLEngine做的。
我自己遇到了同样的问题,最后写了一个库(TLS Channel)。它不仅如此,它实际上是SSLEngine的完全抽象,暴露为ByteChannel。关于SNI,可以向服务器通道提供一个功能,根据提供的域名选择SSLContexts。