本文作者:李伟,社区里大家叫小伟,Apache RocketMQ Committer,RocketMQ Python 客户端我的项目 Owner,Apache Doris Contributor,腾讯云 RocketMQ 开发工程师。
01 传输架构图
Namesrv:5.1.0
Broker:5.1.0
Dashboard:1.0.1-SNAPSHOT
02 筹备 Namesrv、Broker、Client 的 ca 证书、密钥
以下全副操作在的目录在:/etc/rocketmq, 并且 Namesrv、Broker、Dashboard 在同一个机器上
实际操作时,dashboard 或者客户端能够是其余的机器
- 生成 ca 签名证书
填写与反复填写 ca 证书明码。理论填写的时候是输出的字符是看不见的。
openssl req -newkey rsa:2048 -keyout ca_rsa_private.pem -x509 -days 365 -out ca.pem
- 填写其余信息,不填的话应用“.”
生成 ca 签名证书
- 生成公私密钥。提供给客户端 - 服务端加密传输应用
openssl req -newkey rsa:2048 -keyout server_rsa.key -out server.csr
Generating a 2048 bit RSA private key
生成加密密钥对
- 生成 Namesrv、Broker 加密密钥对,并且签发 Namesrv、Broker 证书
openssl req -newkey rsa:2048 -keyout server_rsa.key -out server.csrGenerating a 2048 bit RSA private key
生成 Namesrv、Broker 密钥,签发证书
- 打包并加密 Namesrv、Broker 私钥
- 增加 Namesrv、Broker 应用的 tls 配置文件
- tls-broker.properties
tls.test.mode.enable=false
tls.server.need.client.auth=none
tls.server.keyPath=/etc/rocketmq/server.key
tls.server.keyPassword=123456
tls.server.certPath=/etc/rocketmq/server.pem
tls.client.authServer=false
tls.client.trustCertPath=/etc/rocketmq/ca.pem
- tls-namesrv.properties
tls.test.mode.enable=false
tls.server.need.client.auth=none
tls.server.keyPath=/etc/rocketmq/server.key
tls.server.keyPassword=123456
tls.server.certPath=/etc/rocketmq/server.pem
- tls-client.properties
tls.client.trustCertPath=/etc/rocketmq/ca.pem
至此,咱们失去了全副的 tls 配置文件:
全副配置文件
03 批改启动脚本
3.1 批改 namesrv 启动脚本
vim bin/runserver.sh
批改 namesrv 启动脚本
3.2 批改 broker 启动配置
- 批改 broker 启动脚本,设置 jvm 反对 tls
vim bin/runbroker.sh
批改 broker 启动脚本
- 增加 broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr = 127.0.0.1:9876
3.3 批改 dashboard 配置
- 批改 namesrv 地址
批改 namesrv 地址
- 关上 tls 开关
vim rocketmq-dashboard-1.0.1-SNAPSHOT.jar
批改 dashboard 配置
阐明:如果是客户端生产生产,设置如下
消费者开启 tls 开关
生产者开启 tls 开关
04 启动 Namesrv,Broker,Dashboard
- 启动 namesrv
nohup sh bin/mqnamesrv &
- 启动 broker
nohup sh bin/mqbroker -c conf/broker.conf &
- 启动 dashboard
java -Dtls.client.authServer=true -Dtls.enable=true -Dtls.test.mode.enable=false -Dtls.config.file=/etc/rocketmq/tls-client.properties -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar
05 验证
- tcpdump 抓包验证
TLS 抓包后果
- rocketmq dashboad 日志验证: ~/logs/rocketmqlogs/rocketmq_client.log
06 问题:抓包后果中,为什么还有 TCP 协定呢?
- 抓包后果中,为什么还有 TCP 协定呢?
- 客户端能够通过设置:-Dtls.enable=true 开启,然而理论还是须要设置代码 ”producer.setUseTLS(useTls);” 或者“consumer.setUseTLS(useTls);”,为什么?
07 看看生成的最终文件到底是什么?
- ca.pemca 根证书
- ca_rsa_private.pemca 根证书的加密私钥
- server.pem 应用跟证书签发的 Namesrv、Broker 的证书
- server_rsa.keyNamesrv、Broker 的加密私钥
- server.csrNamesrv、Broker 的加密证书的公钥和用于分别证书迁徙机构的名称信息
- server.key 打包并加密后的 Namesrv、Broker 的私钥(server_rsa.key)
- ca.srlca 签发证书的序列号
1、tls-namesrv.properties
内容见上文,是 namesrv 中 netty 辨认的 tls 加密传输的配置
2、tls-broker.properties
内容见上文,是 broker 中 netty 辨认的 tls 加密传输的配置
3、tls-client.properties
内容见上文,是 client 中 netty 辨认的 tls 加密传输的配置
PS:RocketMQ 的 tls 配置 4.X 版本和 5.X 版本差不多,根本都能够用。