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