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