2

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

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

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

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

4

2 回答 2

2

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

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

于 2017-07-22T13:35:31.130 回答
1

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

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

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

于 2016-02-10T17:20:02.123 回答