java代码如何开启关闭mq服务,如何禁用RocketMQ TLSv1.0?

本文详细介绍了如何在RocketMQ 4.2环境中禁用TLSv1.0,包括通过修改JAVA_HOME/jre/lib/security/java.security配置文件和直接修改开源组件netty源代码的方法,并提供了测试验证和总结。
摘要由CSDN通过智能技术生成

原标题:如何禁用RocketMQ 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)都需要修改启动参数。

fa617877635e5e934be424b1e93db288.png

RocketMQ启动命令:

启动参数设置

-Dhttps.protocols=TLSv1.2

-Djdk.tls.disabledAlgorithms=SSLv3,RC4,MD5withRSA,DH,TLSv1

-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2

3d4507c081855fcdee4869471b9c7a15.png

执行如下测试命令,发现仍然可以使用TLSv1.0建立连接:

Openssl s_client -connect localhost:9876-tls1

f209936f4960548bd741d8d2f132c405.png

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协议连接,看看能否成功?

a7e42d0c1ec19e203d897509f8bf4e0d.png

如图所示,TLSv1.0协议连接失败,成功禁用TLSv1.0。

b3d9c9b7d5ec5b2d240ae7446e4daa02.png

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

7c88fe026933c73f31794d442629e981.png

RocketMQ引用第三方组件netty实现SSL/TLS

fb1080ba8c976c6d7e132c07ad8f1aa9.png

\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

a332cc649d2d4c33b2c038b8fba1be43.png

\netty-4.1\handler\src\main\java\io\netty\handler\ssl\JdkSslContext.java

eb5757e660518d663c32593615cb398b.png

0×06 总结

两个可行方法:

1) 修改JAVA_HOME/jre/lib/security/java.security配置文件

2) 修改开源组件netty源代码

建议关键词:RocketMQ 禁用 disable TLSv1.0

*本文作者:whwofei,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值