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

Java 在使用SSLEngine之前,如何获取请求的域名?,java,ssl,sslengine,Java,Ssl,Sslengine,我想先获得java中的域名,然后再决定使用哪个证书发回。我怎样才能做到这一点 我需要自己分析字节吗?或者有没有图书馆?或者一些JavaSSL库可以做到这一点 相关职位 但是我希望只使用java库来获取主机名。在使用SSLEngine之前不需要它。在自定义KeyManager实现中,在chooseServerAlias()方法中需要它。您需要通过下列技术之一发现域名,然后创建X509KeyManager实现,并进行适当配置以返回相应的密钥库别名,然后构建SSLContext,使用KeyManag

我想先获得java中的域名,然后再决定使用哪个证书发回。我怎样才能做到这一点

我需要自己分析字节吗?或者有没有图书馆?或者一些JavaSSL库可以做到这一点

相关职位


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

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

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

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


  • 很难解释,这是不可能直接用SSLEngine做到的


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

    在使用
    SSLEngine之前,您不需要它,
    您需要它在
    KeyManager.GetServerAlias()/chooseServerAlias()
    方法中。@EJP确定吗?那么,当我收到握手信息时,我应该调用什么方法呢?KeyManagerFactory.processClientHelloHandshake(字节[]数据)?我在这里也看不到KeyManager上的任何方法。。。。它会打电话给你,而不是反过来。引擎将调用我提到的方法。没有任何东西能打败德国工程师。这真是太棒了!感谢您提供此服务。我冒昧地将您提取SNI的代码包含在编辑建议中。