【问题标题】:How to disable Java's SSL Reverse DNS Lookup如何禁用 Java SSL 反向 DNS 查找
【发布时间】:2023-03-16 22:51:01
【问题描述】:

我有一个正在开发的服务器,并且有几个开发人员正在连接它。 此服务器使用带有SSLEngine 的Java TLS 实现。

我们看到,起初,每个新连接都会有很长的延迟(30-40 秒)。我们将其缩小到反向 DNS 查找超时。我们通过将所有 IP 放入 HOSTS 文件中解决了这个问题。

现在,问题是我们将逐步扩大我们的用户群,我不想编辑 HOSTS 文件,特别是因为我们不能保证他们将拥有静态 IP。

有没有办法在 Java 的 SSL/TLS 中禁用反向 DNS 查找步骤?

我想将此作为可配置参数,以便我们可以在开发过程中将其关闭。

【问题讨论】:

  • 您使用的是什么应用服务器? Oracle WebLogic Server 使用 Certicom 而不是 Sun JSSE 实现,因此配置机制各不相同。

标签: java ssl dns


【解决方案1】:

我今天尝试仅通过 IP 地址创建 SSL 套接字连接时遇到了同样的问题。这导致了反向 DNS 查找尝试,因此它真的很慢......

对我来说,解决方案只是在为 SSL 连接创建 InetAddress 时传递一个虚拟的空字符串作为主机名。也就是我改了

InetAddress.getByAddress(addrBytes)

InetAddress.getByAddress("", addrBytes)

它不再进行反向 DNS 查找。

【讨论】:

    【解决方案2】:

    这个问题于 2006 年在 Sun JSSE forums 上提出。底线是它似乎只发生在 Windows java 运行时。在this bug report 的底部,是一种建议的解决方案。这里是another proposed solution

    基本上,SSL 握手期间的反向 DNS 查找会导致很长时间 超时。

    要解决此问题,请将您的服务器地址缓存为 InetAddress 对象 并在创建新时在 Socket 构造函数中重用它 连接到您的服务器。

    希望其中之一对您有用。

    【讨论】:

    • 缓存是什么意思?我们怎样才能做到这一点?
    【解决方案3】:

    Ari 将空主机名传递给InetAddress 的解决方案适用于连接到单个主机,但在通过 IP 地址连接到多个主机时会产生一些副作用。 Java 使用元组 <remote-hostname, port> 缓存 SSLSession 对象。这可以在 OpenJDK here 中看到。因此,先前连接的 TLS 设置(在我的情况下特别是 TLS 协议版本)被应用于与不同主机的新连接(因为两者共享相同的空主机名)。就我而言,新主机拒绝了之前主机协商的降级 TLS v1 协议,导致 TLS 握手错误。

    解决方案是根据远程 IP 地址构造一个唯一的主机名,而不是像这样:

    String hostname = String.format("host-%s", BaseEncoding.base16().encode(address.getAddress()));
    InetAddress newAddress = InetAddress.getByAddress(hostname, address.getAddress());
    

    因此,Java 执行的反向 DNS 查找被禁用,但缓存到远程主机的 TLS 设置仅应用于相同的远程主机和端口,没有串扰效应。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      相关资源
      最近更新 更多