SSL 握手问题
Posted
技术标签:
【中文标题】SSL 握手问题【英文标题】:SSL handshake problems 【发布时间】:2011-03-23 16:48:09 【问题描述】:我们的服务器应用程序在某些客户中遇到了极其缓慢的问题。缓慢通过服务器重新启动解决,但它会在几周后恢复。
Java CPU 始终在 100% 左右(超出 200%),所有其他参数都很好。研究表明,大部分 CPU 被“HandshakeCompletedNotify-Thread”线程消耗。从 tcp dump 我们看到 SSL 握手需要 2-8 秒,时间很长,有时会抛出超时。
我们的 SSL 提供商是 BSAFE。服务器在 Linux(CentOS)、640 mb 堆、2 个内核上运行。 Hibernate、spring都用,Oracle本地db
出现这种行为的原因可能是什么?可以做些什么来找出它们?
附:我们无法将客户的流量切换到 HTTP。
更新:当java进程的传出连接被IP表阻塞时,系统完全释放。在这种情况下释放了哪些资源? 我们看到 SSL 握手经常卡在“更改密码规范”阶段。客户端(我的 java 进程)尝试重用 SSL 会话,但服务器完全无状态,每次都会生成新会话。
【问题讨论】:
您是否使用 jvisualvm 之类的工具对应用程序进行了概要分析? 向我们的客户(大型银行或公司)解释我们想要对他们进行分析有点困难,但我们朝着这个方向努力。我们通常使用 Yourkit 进行分析。 jvisualvm 比 Yourkit 好吗? 您有可以分析的测试系统吗? 不幸的是我没有。没有在QA中复制,但是有很多客户的抱怨 【参考方案1】:这是 Sun 在 6u10 推出下一代 Java 插件时引入的一个已知错误。 Oracle 最终在 Java 7u2 中修复了它,但他们还没有将它向后移植到 Java 6,至少在 6u33 中是这样。
有关该错误的详细信息,#7060523,可以找到here。
【讨论】:
【参考方案2】:您可能想查看针对 JBoss 的 this issue 报告(不确定您是否正在使用)。该问题表明HandshakeCompletedNotify-Thread
可以抛出ConcurrentModificationException
,这是竞态条件的一种可能结果。其他结果包括陷入无限循环并与 CPU 挂钩的代码,这听起来像是您的症状。如果您正在使用 JBoss,或者与导致报告的问题相关的库,我会考虑升级它。它可能会解决您的问题。
【讨论】:
症状和你描述的差不多,但是我们用的是Tomcat。【参考方案3】:您可以尝试切换到 JRE 默认的 JSSE 实现,看看是否存在 BSAFE 错误。
启用 JSSE 调试代码也很有价值(javax.net.debug
属性)。
这些链接对调试 JSSE 非常有帮助
http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html
【讨论】:
这可能是我们与分析一起的下一步。感谢您提到 javax.net.debug 属性,它可能很有用。【参考方案4】:您是否分析过您的 DNS 查找。当 dns 查找速度较慢时,SSL 握手可能需要更长的时间,它需要查找和反向查找才能有效。
【讨论】:
是的,我们已经考虑过这个问题。 DNS 工作正常。谢谢。以上是关于SSL 握手问题的主要内容,如果未能解决你的问题,请参考以下文章
另一个 Paypal Curl / SSL v3 握手错误 - SSL23_GET_SERVER_HELLO:sslv3 警报握手失败