RocketMQ 5.0 如何配置TLS加密传输?
Posted RocketMQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ 5.0 如何配置TLS加密传输?相关的知识,希望对你有一定的参考价值。
本文作者:李伟,社区里大家叫小伟,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版本差不多, 基本都可以用。
配置 vsftpd 使用 SSL 证书加密数据传输
FTP 与 HTTP 一样缺省状态都是基于明文传输,希望 FTP 服务器端与客户端传输保证安全,可以为 FTP 配置 SSL
TLS
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。
传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)。在浏览器、邮箱、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。主要的网站,如Google、Facebook等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连线,防止在交换数据时受到窃听及篡改。
TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
TLS协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的TLS协议通信端口(例如:用于HTTPS的端口443);另一个是客户端请求服务器连接到TLS时使用特定的协议机制(例如:邮件、新闻协议和STARTTLS)。一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于创建安全连接:
-
当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。
-
服务器从该列表中决定加密和散列函数,并通知客户端。
-
服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。
-
客户端确认其颁发的证书的有效性。
-
为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。
-
利用随机数,双方生成用于加密和解密的对称密钥。这就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。
SSL 1.0、2.0和3.0
SSL(Secure Sockets Layer)是网景公司(Netscape)设计的主要用于Web的安全传输协议,这种协议在Web上获得了广泛的应用。
基础算法由作为网景公司的首席科学家塔希尔·盖莫尔(Taher Elgamal)编写,所以他被人称为“SSL之父”。
2014年10月,Google发布在SSL 3.0中发现设计缺陷,建议禁用此一协议。攻击者可以向TLS发送虚假错误提示,然后将安全连接强行降级到过时且不安全的SSL 3.0,然后就可以利用其中的设计漏洞窃取敏感信息。Google在自己公司相关产品中陆续禁止回溯兼容,强制使用TLS协议。Mozilla也在11月25日发布的Firefox34中彻底禁用了SSL 3.0。微软同样发出了安全通告。
-
1.0版本从未公开过,因为存在严重的安全漏洞。
-
2.0版本在1995年2月发布,但因为存在数个严重的安全漏洞而被3.0版本替代。
-
3.0版本在1996年发布,是由网景工程师Paul Kocher、Phil Karlton和Alan Freier完全重新设计的。较新版本的SSL/TLS基于SSL 3.0。SSL 3.0作为历史文献IETF通过RFC 6101发表。
- cd /etc/vsftpd
- 使用 OpenSSL 生成自签证书
openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650 - OpenSSL 简单参数解释:
req #是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 #X.509 证书数据管理。
days #定义证书的有效日期。
newkey #指定证书密钥处理器。
keyout #设置密钥存储文件。
out #设置证书存储文件,注意证书和密钥都保存在一个相同的文件 - mkdir .sslkey
mv vsftpd.pem .sslkey/
- 修改配置文件,支持 SSL
- vim vsftpd.conf
- ssl_enable=YES #启用 SSL 支持。
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#上面四行 force 表示强制匿名用户使用加密登陆和数据传输。
ssl_tlsv1=YES #指定 vsftpd 支持 TLS v1。
ssl_sslv2=YES #指定 vsftpd 支持 SSL v2。
ssl_sslv3=YES #指定 vsftpd 支持 SSL v3。
require_ssl_reuse=NO #不重用 SSL 会话,安全配置项 。
ssl_ciphers=HIGH #允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者。 - rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem #定义 SSL 证书和密钥文件的位置。
-
注意:上面的配置项不要添加到 vsftpd.conf 文件最后也不要加注释,否则启动报错。而且配置后不能有多余的空格。
修改完配置文件后,重启服务:
systemctl restart vsftpd - 配置 FileZilla 客户端验证
以上是关于RocketMQ 5.0 如何配置TLS加密传输?的主要内容,如果未能解决你的问题,请参考以下文章