内容简介:前几天同事找到我,话说他们的系统,被扫描到仍在使用低版本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值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算机程序设计艺术(第3卷 英文版·第2版)
Donald E.Knuth / 人民邮电出版社 / 2010-10 / 119.00元
《计算机程序设计艺术》系列被公认为计算机科学领域的权威之作,深入阐述了程序设计理论,对计算机领域的发展有着极为深远的影响。本书是该系列的第3卷,扩展了第1卷中信息结构的内容,主要讲排序和查找。书中对排序和查找算法进行了详细的介绍,并对各种算法的效率做了大量的分析。 本书适合从事计算机科学、计算数学等各方面工作的人员阅读,也适合高等院校相关专业的师生作为教学参考书,对于想深入理解计算机算法的读......一起来看看 《计算机程序设计艺术(第3卷 英文版·第2版)》 这本书的介绍吧!