RabbitMQ开启TLS支持,解决AMQP明文身份验证漏洞

随着网络通信安全性的日益重要,我们不难发现,在企业级应用中,数据传输的安全防护措施已经成为不可或缺的一环。近期,不少使用RabbitMQ的开发团队收到了关于“远程主机允许明文身份验证”的漏洞警告。为确保敏感信息的安全传递,启用TLS(Transport Layer Security)支持成为了关键的解决方案。本文将详细介绍如何在RabbitMQ中启用TLS加密,以及在SpringBoot应用中配置TLS并设置EXTERNAL认证,通过实际操作步骤解决明文身份验证漏洞。


一、启用RabbitMQ的TLS支持

1. 使用OpenSSL生成服务端证书

# 创建自签名CA证书,执行命令后根据提示设置CA私钥加密密码,并填写国家、地区等信息
openssl req -x509 -newkey rsa:4096 -sha512 -days 3650 -out ca_cert.pem -keyout ca_key.pem# 生成RabbitMQ服务器私钥,执行命令后根据提示设置服务器私钥加密密码
openssl genpkey -algorithm RSA -out rabbit_server_key.pem -aes256# 创建证书签名请求CSR,执行命令后根据提示输入上述服务器私钥加密密码
openssl req -new -key rabbit_server_key.pem -out rabbit_server.csr# 使用之前创建的CA证书来签署服务器的CSR以生成服务器证书
openssl x509 -req -in rabbit_server.csr -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -out rabbit_server_cert.pem -days 3650 -sha512

上述命令产生以下证书/私钥文件:

ca_cert.pem:CA证书文件。

ca_key.pem:CA私钥文件。

rabbit_server_cert.pem:RabbitMQ服务器证书文件。

rabbit_server_key.pem:RabbitMQ服务器私钥文件。

产生的以下中间文件可删除:

rabbit_server.csr、ca_cert.srl

2. 配置RabbitMQ启用TLS

将生成的证书/私钥文件放置到RabbitMQ配置目录下(比如:/etc/rabbitmq/ssl),然后在rabbitmq.conf文件中添加SSL相关配置:

listeners.ssl.default = 5671
auth_mechanisms.1 = EXTERNAL
ssl_options.cacertfile = /etc/rabbitmq/ssl/ca_cert.pem
ssl_options.certfile = /etc/rabbitmq/ssl/rabbit_server_cert.pem
ssl_options.keyfile = /etc/rabbitmq/ssl/rabbit_server_key.pem
ssl_options.password = #服务器私钥加密密码
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
ssl_cert_login_from = common_name

可以完全禁用常规(非TLS)监听,只有启用TLS的客户端使用正确的端口才能连接,添加以下配置:

# disables non-TLS listeners, only TLS-enabled clients will be able to connect
listeners.tcp = none

如果RabbitMQ配置文件使用经典配置格式,可以这样设置TLS配置:

[{rabbit, [{ssl_listeners, [5671]},{ssl_options, [{cacertfile, "/etc/rabbitmq/ssl/ca_cert.pem"},{certfile, "/etc/rabbitmq/ssl/rabbit_server_cert.pem"},{keyfile, "/etc/rabbitmq/ssl/rabbit_server_key.pem"},{verify, verify_peer},{fail_if_no_peer_cert, true}]},{auth_mechanisms, ['EXTERNAL']},{ssl_cert_login_from, common_name}]}
].

配置说明:

ssl_listeners:SSL协议端口。

cacertfile:CA证书路径。

certfile:服务器公钥路径。

keyfile:服务器私钥路径。

verify:verify_peer-使用对等验证,客户端与服务端交换证书并验证;verify_none-禁用对等验证,并且不会执行证书交换。

fail_if_no_peer_cert:true-不接受没证书的客户端连接;false-接受没证书的客户端连接。

auth_mechanisms:认证机制,EXTERNAL-使用插件提供认证功能;PLAIN-SASL PLAIN验证。在RabbitMQ服务器和客户端

ssl_cert_login_from:使用证书中的common_name(即CN)作为登录用户名(见下文创建客户端证书部分)。

为确保私钥文件的安全,产生的私钥文件默认仅属主用户可读写。需要检查文件权限,确保RabbitMQ运行用户可读,避免启动RabbitMQ服务时报错:ssl_options.keyfile invalid, file does not exist or cannot be read by the node.


二、客户端使用使用TLS连接

1. 使用OpenSSL生成客户端证书

# 创建客户端私钥,执行命令后根据提示设置私钥加密密码
openssl genpkey -algorithm RSA -out rabbit_client.key -aes256# 从私钥创建证书签名请求CSR,执行命令后根据提示输入上述私钥密码
# 根据服务端ssl_cert_login_from的配置,CN=admin将使用admin作为登录RabbitMQ的用户名
openssl req -new -key rabbit_client.key -out rabbit_client.csr -subj "/CN=admin/O=Your Organization Name/C=CN"# 使用自签名CA证书和服务器私钥生成客户端证书(将rabbit_client.csr文件上传到RabbitMQ服务器执行)
openssl x509 -req -in rabbit_client.csr -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -out rabbit_client.crt -days 3650 -sha512# 使用客户端证书创建客户端PKCS12格式的KeyStore,执行命令后,根据提示先输入客户端私钥密码,再设置KeyStore密码
openssl pkcs12 -export -in rabbit_client.crt -inkey rabbit_client.key -out rabbit_client.p12 -CAfile ca_cert.pem -name rabbit_client -caname rabbit_root_ca# 将CA证书添加到TrustStore,以信任该CA证书,执行命令后,根据提示先设置TrustStore密码,再输入yes信任这个CA证书
keytool -importcert -alias rabbit_root_ca -keystore rabbit_truststore.jks -file ca_cert.pem

上述命令产生以下证书/私钥文件:

rabbit_client.p12:客户端PKCS12格式的KeyStore,用于存储客户端证书与私钥。

rabbit_truststore.jks:客户端TrustStore文件,存放信任的CA证书。

产生的以下中间文件可删除:

rabbit_client.key、rabbit_client.csr、rabbit_client.crt

2. 应用配置

将生成的KeyStore和Truststore文件放置到应用配置目录下(如:resources/ssl),然后在应用配置文件中进行TLS相关配置:

spring:rabbitmq:addresses: server:5671ssl:enabled: truekey-store: classpath:ssl/rabbit_client.p12key-store-password: #KeyStore密码trust-store: classpath:ssl/rabbit_truststore.jksverify-hostname: false

3. 应用设置EXTERNAL认证机制

@Configuration
@ConditionalOnProperty(name = "spring.rabbitmq.ssl.enabled", havingValue = "true")
public class RabbitmqSslConfig {@AutowiredCachingConnectionFactory cachingConnectionFactory;/*** 解决安全扫描AMQP明文登录漏洞,显式设置EXTERNAL认证机制* EXTERNAL认证机制使用X509认证方式,服务端读取客户端证书中的CN作为登录名称*/@PostConstructpublic void rabbitmqSaslExternal() {cachingConnectionFactory.getRabbitConnectionFactory().setSaslConfig(DefaultSaslConfig.EXTERNAL);}
}

通过上述步骤,我们成功实现了在RabbitMQ中启用TLS加密,从而有效地解决了明文身份验证带来的安全隐患。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4核8G服务器选阿里云还是腾讯云?价格性能对比

4核8G云服务器多少钱一年?阿里云ECS服务器u1价格955.58元一年,腾讯云轻量4核8G12M带宽价格是646元15个月,阿腾云atengyun.com整理4核8G云服务器价格表,包括一年费用和1个月收费明细: 云服务器4核8G配置收费价格 阿里…

新加坡服务器托管:开启全球化发展之门

新加坡作为一个小国家,却在全球范围内享有极高的声誉。新加坡作为亚洲的科技中心,拥有先进的通信基础设施和成熟的机房托管市场。除了其独特的地理位置和发达的经济体系外,新加坡还以其开放的商业环境和便利的托管服务吸引着越来越多的国际公…

C#之WPF学习之路(6)

目录 内容控件(3) GroupBox标题容器控件 ScrollViewer控件 ScrollBar滚动条 Slider滑动条 ProgressBar进度条 Calendar日历控件 DatePicker日期控件 Expander折叠控件 MediaElement媒体播放器 内容控件(3) GroupBox标题…

在两台CentOS 7服务器上部署MinIO集群---准确

环境说明: 2台Centos7服务器 IP地址分别为172.16.1.9和172.16.1.10 1. 创建minio用户和目录 在两台服务器上执行以下命令: sudo useradd -m -d /app/minio minio sudo mkdir -p /app/minioData sudo mkdir -p /app/minio/logs sudo chown -R mini…

2024年2月26日-3月3日(全面进行+收集免费虚幻商城资源,)

依旧按照月计划进行。 周一: 18:40–19:50,测量学基础(4.1),数字图像处理3.4, 周二: 6;00-8:50测量学基础(4.1),数字图像处理3.5&…

解析数据挖掘:发掘数据中的宝藏

数据挖掘作为一种从大规模数据中发现模式、规律和知识的技术和方法,已经在各个领域展现了强大的应用价值。本文将从数据挖掘的定义、流程、常用算法以及应用场景等方面进行科普介绍,帮助读者深入了解数据挖掘的概念及其在实际应用中的重要作用。 1. 数据…

vue项目打包获取git commit信息并输出到打包后的指定文件夹中

需求背景: 前端项目经常打包,发包部署,为了方便测试及运维发现问题时与正确commit信息对比 实现方式: 使用Node.js的child_process模块来执行git命令 实现步骤: 1.在package.json的同级目录下新建一个version.js文件。…

459. 重复的子字符串(力扣LeetCode)

文章目录 459. 重复的子字符串题目描述暴力移动匹配KMP算法 459. 重复的子字符串 题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: …

【C++进阶】哈希(万字详解)—— 学习篇(上)

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

Java 枚举(Enum)简介

Java 枚举(Enum)是一种特殊的类,它用于定义一组固定的常量值。枚举提供了一种类型安全的方式来表示一组固定的值。在 Java 中,枚举是实现单例模式的一种方式,并且它们是 Java 语言的一部分,而不是类库的一部…

30天自制操作系统(第21天)

21.1 攻克难题——字符串显示API 显示单个字符时,用 [CS:ECX] 的方式特意指定了 CS(代码段寄存器),因此可以成功读取 msg的内容。但在显示字符串时,由于无法指定段地址,程序误以为是 DS而从完全错误的内存地…

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之传统的网络安全

ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动的自然语言处理工具。 基于其语言模型庞大、可控制、具有高度扩展性的特点,本文通过对话Chat…

111期_C++_2024年1月份作业博客_选择题错题总结

一、野指针问题:在定义的时候没有初始化,就不能能用scanf 或 printf 二、一个变量出现在表达式的两边作为两个不同的操作数, 并且其中一个操作数带有,此时表达式出现歧义 三、两端出栈问题: 错因:未理解题…

素皮材质的手机壳,如何才能做到经久耐用?

近几年,素皮材质开始在手机背壳上开始应用,各家手机厂商,基本都给自己的旗舰系列设备推出了带素皮材质版本的手机款式,比如华为的Mate 60系列,不仅Pro版本有素皮材质,Pro版本更是黑白两款全是素皮材质。 那…

Docker的基础知识与应用技巧

文章目录 一.docekr简介二.docekr安装三.docker命令 一.docekr简介 Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于轻量级虚拟化技术&a…

交易这条路,没有永远的大神,唯有攀登者

一、摆平心态 很多人一谈及金融,首先想到的就是赚钱,而忽视了亏损和风险的存在。面对亏损时,许多人不是选择止损,而是选择加仓,希望通过大赚一笔来弥补损失。然而,这种做法往往会让他们在市场中受到惨痛的教…

桥接模式(Bridge Pattern) C++

上一节:适配器模式(Adapter Pattern) C 文章目录 0.理论1.组件2.使用场景 1.实践 0.理论 桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心思想是将抽象部分与其实现部分分离,使它们可…

mac打不开xxx软件, 因为apple 无法检查其是否包含恶意

1. 安全性与隐私下面的允许来源列表,有些版本中的‘任何来源’选项被隐藏了,有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable

leetcode 2.27

leetcode hot 100 哈希1.字母异位词分组2.最长连续序列 双指针1.盛最多水的容器2.和为 K 的子数组 数组1.除自身以外数组的乘积 哈希 1.字母异位词分组 49. 字母异位词分组 方法一:排序 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符…

Ribbon负载均衡:提升应用性能与可靠性的秘密武器(一)

本系列文章简介: 本系列文章将深入探讨Ribbon负载均衡的工作原理、应用场景和实践经验,帮助大家更好地理解和应用这一强大的技术。通过合理配置和优化Ribbon负载均衡,您可以为您的应用带来更高的性能和可靠性,从而获得竞争优势并满…