如何加快SSLHandshake?

我有一个Java应用程序,使SSL连接到远程服务器。

当我从我的开发机器( 在地理位置上更接近远程服务器,在不同的networking上,运行Win7运行应用程序时,连接需要不到一秒的时间才能完成。

从生产计算机( Solaris )运行应用程序时,SSL连接需要10秒以上才能完成。

我想了解我能做些什么来加快这个连接时间。

我已经打开了debugging跟踪(用一个扩展的printstream来logging已用时间):

-Djavax.net.debug =所有

我可以看到,大部分的丢失时间发生在客户端完成客户端更改密码规范之后,在写和读之间。

<Elapsed [4249]ms> *** Finished <Elapsed [4251]ms> *** <Elapsed [4251]ms> [write] MD5 and SHA1 hashes: len = 16 <Elapsed [4254]ms> Padded plaintext before ENCRYPTION: len = 48 <Elapsed [4258]ms> main, WRITE: TLSv1 Handshake, length = 48 <Elapsed [11230]ms> main, READ: TLSv1 Change Cipher Spec, length = 1 <Elapsed [11231]ms> JsseJce: Using cipher AES/CBC/NoPadding from provider SunJCE <Elapsed [11360]ms> main, READ: TLSv1 Handshake, length = 48 <Elapsed [11360]ms> Padded plaintext after DECRYPTION: len = 48 <Elapsed [11364]ms> *** Finished 

我可以考虑哪些选项来加速握手?

  • 更新JRE? 服务器当前在1.4.2上运行。
  • 反向DNS? 我见过一些build议,反向DNS可以帮助加快SSL握手。 生产服务器的开发服务器目前都没有使用反向DNS。
  • networking故障排除 – 从networking团队的指示是networking是好的?
  • 增加CPU /内存 – 监控表明我们在握手过程中没有达到内存或CPU的100%?
  • 的/ dev /随机的? 我见过访问/ dev / random的引用,而在solaris握手中使用的随机数据可能会很慢?


参考文献
本文将详细介绍SSL握手 – 向下滚动到“SSL协议”部分,该部分提供了一个注释,说明握手的15个步骤:
http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#SSLOverview

本文将介绍如何使用debugging消息完成SSL握手以供参考:
http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html

– 编辑
在问题networking内的不同机器上进行testing显示出一些有趣的结果。 SSL握手的前10个步骤发生了两次,但在“完成”阶段写入的延迟占用了总握手时间的80%。

 <Elapsed [1816]ms> main, WRITE: TLSv1 Handshake, length = 48 <Elapsed [10078]ms> main, READ: TLSv1 Change Cipher Spec, length = 1 

你有没有尝试从另一台机器在同一个网站连接,它仍然是慢? 远程机器是否也是Solaris?

我会说尝试更新JVM,如果你可以先testing一台同样的机器。

对于反向DNS,在/ etc / hosts中添加一个条目就足够了。

Solaris机器是什么型号和操作系统版本? 一些有encryption芯片,你可以尝试看看它是否启用。

这个问题的具体实例的原因是服务器上的反向DNS查找失败。

这是由客户端的DNS名称服务器的更改引起的,这些DNS名称服务器在服务器端未被拾取。

这个问题在客户端和服务器端都可以使用Wireshark进行隔离,并且可以使用dig来进行确认

 dig @namserverURL -x serverIP +trace 

一旦解决了DNS问题,SSL握手速度就大大提高了。