本文作者:李伟,社区里大家叫小伟,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或者客户端能够是其余的机器

  1. 生成ca签名证书

填写与反复填写ca证书明码。理论填写的时候是输出的字符是看不见的。

openssl req -newkey rsa:2048 -keyout ca_rsa_private.pem -x509 -days 365 -out ca.pem
  • 填写其余信息, 不填的话应用 “.”

生成ca签名证书

  1. 生成公私密钥。提供给客户端-服务端加密传输应用
openssl req -newkey rsa:2048 -keyout server_rsa.key -out server.csr

Generating a 2048 bit RSA private key

生成加密密钥对

  1. 生成Namesrv、Broker加密密钥对,并且签发Namesrv、Broker证书
openssl req -newkey rsa:2048 -keyout server_rsa.key -out server.csrGenerating a 2048 bit RSA private key

生成Namesrv、Broker密钥,签发证书

  1. 打包并加密Namesrv、Broker私钥

  1. 增加Namesrv、Broker应用的tls配置文件
  • tls-broker.properties
tls.test.mode.enable=falsetls.server.need.client.auth=nonetls.server.keyPath=/etc/rocketmq/server.keytls.server.keyPassword=123456tls.server.certPath=/etc/rocketmq/server.pemtls.client.authServer=falsetls.client.trustCertPath=/etc/rocketmq/ca.pem
  • tls-namesrv.properties
tls.test.mode.enable=falsetls.server.need.client.auth=nonetls.server.keyPath=/etc/rocketmq/server.keytls.server.keyPassword=123456tls.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 = DefaultClusterbrokerName = broker-abrokerId = 0deleteWhen = 04fileReservedTime = 48brokerRole = ASYNC_MASTERflushDiskType = ASYNC_FLUSHnamesrvAddr = 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版本差不多, 根本都能够用。