我有一个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
我可以考虑哪些选项来加速握手?
–
参考文献
本文将详细介绍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握手速度就大大提高了。