2010-07-07 74 views
7

我有一个服务器正在开发中,还有一些开发者连接到它。 此服务器使用Java的TLS实现SSLEngine如何禁用Java的SSL反向DNS查找

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

现在,问题是我们将逐步扩大我们的用户群,并且我不想编辑HOSTS文件,尤其是因为我们无法保证它们将具有静态IP。

有什么方法可以禁用Java的SSL/TLS中的反向DNS查找步骤?

我想这是一个可配置的参数,以便我们可以在开发过程中关闭它。

+0

您使用的是什么应用程序服务器? Oracle WebLogic Server使用Certicom而不是Sun JSSE实现,因此配置机制各不相同。 – 2010-07-07 11:25:24

回答

3

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

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

要解决此问题,请将您的服务器地址缓存为InetAddress对象 ,并在您与服务器建立新的 连接时将其重用到套接字构造器中。

希望其中的一个会为你工作。

+0

缓存是什么意思?我们如何实现这一目标? – Farhan 2017-05-08 12:11:38

11

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

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

InetAddress.getByAddress(addrBytes) 

InetAddress.getByAddress("", addrBytes) 

,它不能再执行反向DNS查找。

0

Ari将空主机名传递给InetAddress的解决方案可以连接到单个主机,但在通过IP地址连接到多个主机时会产生一些副作用。 Java使用元组缓存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()); 

因此,反向DNS查找的Java执行被禁用,但是缓存TLS设置到远程主机只施加到相同的远程主机和端口没有串扰影响。