繁体   English   中英

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

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

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

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

相关文章从 TLS 客户端 hello 中提取服务器名称指示 (SNI)

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM