【问题标题】:How can I get the domain name of the request before using SSLEngine?在使用 SSLEngine 之前如何获取请求的域名?
【发布时间】:2016-05-20 06:46:02
【问题描述】:

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

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

相关帖子 Extract Server Name Indication (SNI) from TLS client hello

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

【问题讨论】:

  • 在使用 SSLEngine, 之前不需要它,但在 KeyManager.getServerAliases()/chooseServerAlias() 方法中需要它。
  • @EJP 好吗?那么当我收到握手消息时我应该调用什么方法呢? KeyManagerFactory.processClientHelloHandshake(字节 [] 数据)?我在这里也看不到 KeyManager 上的任何方法....docs.oracle.com/javase/7/docs/api/index.html?javax/net/ssl/…
  • 它会打电话给你,而不是反过来。引擎会调用我提到的方法。

标签: java ssl sslengine


【解决方案1】:

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

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

【讨论】:

  • 没有什么能比得上德国工程师。这真是太棒了!感谢您提供此功能。我冒昧地将您用于提取 SNI 的代码包含在编辑建议中。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多