内容简介:前几天同事找到我,话说他们的系统,被扫描到仍在使用低版本TLSv1.0,要求禁用掉,本来以为很简单的事情,结果他们折腾好几个月了,都没能搞掉它,每月月报上单位黑榜,急得够呛,最后病急乱投医,找到我问问有没有什么办法。望闻问切,掌握基本信息后,互联网基本思路,解决问题基本靠搜,搜不到再研究,于是百度必应谷歌一通搜,搜半天啥也没有。于是潜下心来,慢慢琢磨,最终得出两个切实可行的解决之道,总结于此,送给有需要的朋友。
*本文作者:whwofei,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
0×00 前言
前几天同事找到我,话说他们的系统,被扫描到仍在使用低版本TLSv1.0,要求禁用掉,本来以为很简单的事情,结果他们折腾好几个月了,都没能搞掉它,每月月报上单位黑榜,急得够呛,最后病急乱投医,找到我问问有没有什么办法。
望闻问切,掌握基本信息后,互联网基本思路,解决问题基本靠搜,搜不到再研究,于是百度必应谷歌一通搜,搜半天啥也没有。于是潜下心来,慢慢琢磨,最终得出两个切实可行的解决之道,总结于此,送给有需要的朋友。
0×01 环境说明
OS:SuSE Linux Enterprise Sever 12 SP2/Centos 6.7 RocketMQ:4.2 JDK1.8
0×02 如何测试是否配置成功?
执行openssl,指定协议版本TLSv1.0进行连接,如果连接成功,则说明配置失败;反之,则配置成功。命令如下:
Openssls_client -connect ip:port -tls1
0×03 失败尝试
SSL/TLS是种协议,不同厂家实现方式不同,其配置方式自然也不同,通常不外乎以下几种:
修改注册表
配置文件
通过系统管理功能配置
启动参数
RocketMQ采用 Java 编写,可能使用了JDK SSL Provider,那么应该可以通过JVM的启动参数来设定TLS版本、算法。RocketMQ bin目录结构和启动命令如下,两条命令,对应两个bash文件(runserver.sh&runbroker.sh)都需要修改启动参数。
RocketMQ启动命令:
启动参数设置
-Dhttps.protocols=TLSv1.2 -Djdk.tls.disabledAlgorithms=SSLv3,RC4,MD5withRSA,DH,TLSv1 -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2
执行如下测试命令,发现仍然可以使用TLSv1.0建立连接:
Openssl s_client -connect localhost:9876-tls1
0×04 失败分析
有两个渠道可以控制JDK使用的TLS协议版本:
1)如上述失败尝试,在启动命令参数中设定禁用的协议算法
-Djdk.tls.disabledAlgorithms=SSLv3,RC4,MD5withRSA,TLSv1
2)还可以通过JAVA_HOME/jre/lib/security/java.security配置文件,配置项目名称与启动参数中完全一致
jdk.tls.disabledAlgorithms=SSLv3,RC4, DES, MD5withRSA, DH keySize < 1024, \EC keySize <224, 3DES_EDE_CBC
配置项目名称完全相同,那么两处配置会不会存在覆盖关系或是互补 ?
因为在上述失败尝试中,我使用了java.security的默认配置,即没有禁用TLSv1.0,所以可得出结论,不是互补关系。
按此推论,我们在JAVA_HOME/jre/lib/security/java.security修改配置,再次使用TLSv1.0协议连接,看看能否成功?
如图所示,TLSv1.0协议连接失败,成功禁用TLSv1.0。
0×05 进一步探索
虽然解决了问题,但始终觉得RocketMQ应该提供一个更为直观的配置方式,怀着疑问和好奇简单地走读了一下RocketMQ的源代码(RocketMQ为开源软件,其核心组件为jboss netty开源组件),发现在netty中硬编码写死了支持TLSv1.0,TLSv1.1,TLSv1.2,所以接下来的解决方案应该不用我说了。该方案也测试通过,可成功禁用。
部分代码列举如下:
\remoting\src\main\java\org\apache\rocketmq\remoting\netty\TlsHelper.java
RocketMQ其实支持两种TLS实现:
1)Openssl provider,如系统安装配置了openssl,则优先使用
2)JDK SSL provider
RocketMQ引用第三方组件netty实现SSL/TLS
\netty-4.1\handler\src\main\java\io\netty\handler\ssl\OpenSsl.java
支持SSL_V2,SSL_V3,TLS_V1,TLS_V_1,TLS_V1_2
\netty-4.1\handler\src\main\java\io\netty\handler\ssl\JdkSslContext.java
0×06 总结
两个可行方法:
1) 修改JAVA_HOME/jre/lib/security/java.security配置文件 2) 修改开源组件netty源代码
建议关键词:RocketMQ 禁用 disable TLSv1.0
*本文作者:whwofei,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何临时或永久地禁用SELinux
- iphone – 移动CALayers时禁用动画
- 当浏览器全面禁用三方 Cookie
- Bootstrap禁用响应式布局的实现方法
- 如何绕过PHP中被禁用的函数
- php – 禁用表单元素的POST值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Big Java Late Objects
Horstmann, Cay S. / 2012-2 / 896.00元
The introductory programming course is difficult. Many students fail to succeed or have trouble in the course because they don't understand the material and do not practice programming sufficiently. ......一起来看看 《Big Java Late Objects》 这本书的介绍吧!