JAVA客户端的SSLSession cache(reuse)

最近,几个客户的服务器使用了新的SSL/TLS证书,导致我们的程序不能正常的和服务器进行连接,一直抛一个SSL相关的异常。而过一段时间(大概一天或者两天),我们的客户端又能正确的访问客户的服务器,很奇怪。

最近一直在研究SSL/TLS,主要是因为产品里面和https打交道的很多,而且也遇到了不少的问题。前两天又遇到一个问题,根据用户的反馈,他们更新了服务器上的SSL/TLS证书,而我们的产品,在他们切换证书后便不能成功的监控他们的服务器,而大概过一段时间(一天或两天),再不做任何修改配置的情况下,又恢复正常了。而且,有两个客户遇到了类似的问题。

通过对日志的分析,发现在我们的产品工作不正常的期间,跑出了如下的异常:

1
2
3
4
5
6
EXCEPTION=server certificate change is restrictedduring renegotiation
javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:269)

问题分析定位

首先,这次两个用户同时反馈了类似的情况,基本可以肯定是由于服务器切换证书导致的,初步怀疑是我们的产品缓存了服务器的证书,但是,可以肯定的是这个证书缓存不是由我们的产品代码管理的。

首先,我想到的是从下面的角度去调查:

  • google搜索异常消息,寻常现有的解决方案

虽然谷歌很强大,搜索出来的结果,主流的解决方法是在JVM启动是,添加一个JVM配置:

1
2
-Djdk.tls.allowUnsafeServerCertChange=true
-Dsun.security.ssl.allowUnsafeRenegotiation=true

但是,我担心这种配置会影响到我们的产品的安全性,所以并未采用…..
紧接着,想到的思路是:

  • 尝试复还现场,在本地环境重现问题
  • 抓包分析

在Toni的支持下,我们在本地的一台服务器上进行试验,首先让服务跑一段时间,我们的产品可以正常工作;更换服务器的证书,并重启服务;果然,我们的产品不能和服务器进行连接。

通过对抓包分析,发现,我们的服务在与服务器进行SSLHandshaking的时候,是携带了非0的SessionId的,也就是说,SSLSession的缓存是确实存在的。所以,问题确认了,正是因为服务器更换了证书,而我们在进行连接的时候尝试复用现有的session,进行简化的SSL handshaking。而在简化的SSL handshake是不会在进行证书的交换的,且JDK默认是不允许服务器进行不安全的证书切换的,所以导致连接失败。而一段时间后,缓存的session被释放了,这时候连接又可以正常的简历并通过handshaking了。

问题解决

在尝试解决问题的过程中也踩过几个坑,虽然最终的解决方法很简单。
JDK的SSLSocket中提供了一个接口:

1
SSLSocket.getSession().getSessionContext().setSessionCacheSize();

一开始,我试了讲cacheSize设置为0,但是,仍然会缓存SSLSession,且进行复用。后来,了解到,原来:

这里的cacheSize最小是0,但是0表示的是无限大,类似于超时设置为0表示永不超时。

当时就我勒个去。。。。
说道超时,于是我也尝试设置SSLSession的超时设置,未果。。。

最后的解决方法是,在每次SSLSocket创建完成并完成SSLHandshking后,使session失效:

1
SSLSocket.getSession().invalidate();

总结

其实这个异常之前遇到过,当时的情况是我们在使用亚马逊的SQS时,一直报这个类似的异常,但是当重启后,又恢复,出现过N次。这次能够找到问题根本,其实应该说我们是幸运的,因为我们的客户给我们反馈的重要的信息:他们更新了服务器的证书~~~

End: 每天总会有些事情是值得记录下来的,所以,以后我会努力每天写一篇文章~

[LeetCode] 318 Maximum Product of Word Lengths linux绑定多网卡

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×