如何禁用Java的SSL反向DNS查找

8
我有一个正在开发中的服务器,有几个开发人员连接到它上面。 这个服务器使用Java的TLS实现,采用SSLEngine。
最初,我们发现每次新连接都需要很长时间(30-40秒)。我们将问题缩小为反向DNS查找超时。我们通过将所有IP放入HOSTS文件中解决了这个问题。
现在的问题是,我们将逐步扩大用户群体,我不想编辑HOSTS文件,特别是因为我们无法保证他们会拥有静态IP地址。
有没有办法禁用Java的SSL/TLS中的反向DNS查找步骤?
我希望将其作为可配置参数,这样我们就可以在开发期间将其关闭。

你正在使用哪个应用服务器?Oracle WebLogic Server 使用的是 Certicom 而不是 Sun JSSE 实现,因此配置机制会有所不同。 - Vineet Reynolds
3个回答

12
今天我遇到了同样的问题,当我仅使用IP地址创建SSL套接字连接时。 这导致进行反向DNS查找尝试,因此速度非常慢... 对我来说,解决方案很简单,只需在创建用于SSL连接的InetAddress时将虚拟空字符串作为主机名传递即可。 也就是说,我更改了
InetAddress.getByAddress(addrBytes)

InetAddress.getByAddress("", addrBytes)

现在它不再进行反向DNS查找。


3
这个问题在2006年出现在Sun JSSE论坛中。最重要的是,它似乎只会发生在Windows Java运行时中。在这个bug报告中,底部是一个提出的解决方案。这里有另一个提出的解决方案:

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

为了解决这个问题,将您的服务器地址缓存为InetAddress对象,并在Socket构造函数中重复使用它,每当您要建立新的连接到您的服务器时。

希望其中之一适用于您。

什么是缓存?我们如何实现它? - Farhan

0
Ari传递空主机名到InetAddress的解决方案可以用于连接单个主机,但是在通过IP地址连接多个主机时会产生一些副作用。Java使用元组<remote-hostname, port>缓存SSLSession对象。这可以在OpenJDK 这里中看到。因此,先前连接的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设置仅适用于相同的远程主机和端口,没有交叉影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接