如何禁用Java';s SSL反向DNS查找
我有一个正在开发的服务器和几个连接到它的开发人员。 此服务器将Java的TLS实现与如何禁用Java';s SSL反向DNS查找,java,ssl,dns,Java,Ssl,Dns,我有一个正在开发的服务器和几个连接到它的开发人员。 此服务器将Java的TLS实现与SSLEngine一起使用 我们看到,一开始,每个新连接都会有一个很长的延迟(30-40秒)。我们将其缩小到反向DNS查找超时。我们通过将所有IP放入主机文件解决了这个问题 现在,问题是我们将逐步扩大我们的用户群,我不想编辑主机文件,特别是因为我们不能保证它们将拥有静态IP 有没有办法在Java的SSL/TLS中禁用反向DNS查找步骤 我想把它作为一个可配置的参数,这样我们就可以在开发过程中关闭它。这个问题是在2
SSLEngine
一起使用
我们看到,一开始,每个新连接都会有一个很长的延迟(30-40秒)。我们将其缩小到反向DNS查找超时。我们通过将所有IP放入主机
文件解决了这个问题
现在,问题是我们将逐步扩大我们的用户群,我不想编辑主机
文件,特别是因为我们不能保证它们将拥有静态IP
有没有办法在Java的SSL/TLS中禁用反向DNS查找步骤
我想把它作为一个可配置的参数,这样我们就可以在开发过程中关闭它。这个问题是在2006年的。底线是,它似乎只发生在Windows java运行时中。在中,接近底部是一个建议的解决方案。以下是: 基本上,SSL握手过程中的反向DNS查找会导致长时间延迟 超时 要解决此问题,请将服务器地址缓存为InetAddress对象 并在创建新的套接字时在套接字构造函数中重用它 连接到您的服务器
希望其中一个能对您起作用。我今天在尝试仅通过IP地址创建SSL套接字连接时遇到了同样的问题。这导致反向DNS查找尝试,因此速度非常慢 对我来说,解决方案只是在为SSL连接创建InetAddress时传递一个伪空字符串作为主机名。就是我变了
InetAddress.getByAddress(addrBytes)
到
而且它不再进行反向DNS查找。Ari将空主机名传递给
InetAddress
的解决方案适用于连接到单个主机,但在通过IP地址连接到多个主机时会产生一些副作用。Java使用元组
缓存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设置仅应用于同一远程主机和端口,而没有串扰效应。您使用的是什么应用程序服务器?Oracle WebLogic Server使用Certicom而不是Sun JSSE实现,因此配置机制各不相同。缓存是什么意思?我们怎么能做到呢?
String hostname = String.format("host-%s", BaseEncoding.base16().encode(address.getAddress()));
InetAddress newAddress = InetAddress.getByAddress(hostname, address.getAddress());