禁用AMQP配置中的明文身份验证机制(包含Springboot结果测试+踩坑)

这篇具有很好参考价值的文章主要介绍了禁用AMQP配置中的明文身份验证机制(包含Springboot结果测试+踩坑)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近公司内网部署RabbitMQ服务器,部署上测试后安全部门扫描到MQ服务器有一个漏洞【禁用AMQP配置中的明文身份验证机制】。本文记录解决该漏洞的过程和方法,以及遇到的问题

配置流程

主要步骤为:

  1. 在服务器生成所需的两对密钥和CA证书,然后将CA、服务器公私钥放到Rabbit目录下并添加配置文件
  2. 将服务器公钥转换为Java专用JKS格式,然后将客户端私钥和JKS一起拷贝到本地,通过Java或者Springboot-amqp连接

生成CA证书、客户端密钥、服务器密钥

目前网络上常用两种生成工具:

  1. CMF-AMQP-Configuration(https://github.com/Berico-Technologies/CMF-AMQP-Configuration.git)
  2. tls-gen(https://github.com/rabbitmq/tls-gen.git)

本文基于CMF-AMQP-Configuration来生成SSL自签名文件

git clone https://github.com/Berico-Technologies/CMF-AMQP-Configuration.git
cd CMF-AMQP-Configuration/ssl
sh setup_ca.sh CANAME # CA名称任意
sh make_server_cert.sh rabbitmq-server SERVER_PASS # 密码任意
sh create_client_cert.sh rabbitmq-client CLIENT_PASS # 密码任意

生成的目录如下

ca #保存CA证书
server # 保存服务器密钥
client # 保存客户端密钥

amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq
amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq
amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq
amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq

复制文件到服务器/etc/rabbitmq/ssl
1. cacert.pem # CA证书文件
2. server.cert.pem # 服务器公钥
3. server.key.pem # 服务器私钥

amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq

然后使用JDK的Keytool工具,将服务器公钥转换为JKS格式

keytool -import -alias rabbitmq-server \
  -file server/rabbitmq-server.cert.pem \
  -keystore rabbitmqStore -storepass STORE_PASS 
  # -alias后为别称,-file后是服务端公钥位置,-keystore后是输出JSK证书位置 STORE_PASS任意

amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq

拷贝客户端需要文件
1. rabbitmqTrustStore # JKS格式服务器公钥文件
2. client/client.key.pem  # 客户端私钥

amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq

Docker部署RabbitMQ

先启动rabbitmq拷贝/etc/rabbitmq/下的
enabled_plugins、conf.d、rabbitmq.conf(如果存在的话)拷贝
到/home/mapping/rabbitmq/etc/rabbitmq下,然后删除容器,继续执行下面的操作

docker pull rabbitmq:3.8.12-management
docker run --restart=unless-stopped --name rabbitmq -p 5672:5672 -p 5671:5671 -p 15672:15672 \
-v /home/mapping/rabbitmq/etc/rabbitmq:/etc/rabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=Rabbit@123 \
-d rabbitmq:3.8.12-management
添加SSL插件

部署完成后,docker exec进入容器,添加插件才能启用SSL验证的功能

rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl
#查看启动结果
rabbitmq-plugins list
添加证书登录用户
#用户名要与客户端证书名称前缀一致
rabbitmqctl add_user 'rabbitmq-client' PASS_WORD
#添加权限 不要忘记了
rabbitmqctl set_permissions -p "/" "rabbitmq-client" ".*" ".*" ".*"

创建etc/rabbitmq/rabbitmq.conf(如果不存在)

listeners.tcp.default = 5672
listeners.tcp = none # 关闭非tls的端口
listeners.ssl.default=5671
ssl_options.cacertfile=/etc/rabbitmq/ssl/cacert.pem
ssl_options.certfile=/etc/rabbitmq//ssl/rabbitmq-server.cert.pem
ssl_options.keyfile=/etc/rabbitmq//ssl/rabbitmq-server.key.pem

ssl_options.verify=verify_peer
ssl_options.fail_if_no_peer_cert=true
ssl_options.versions.1=tlsv1.2
ssl_options.versions.2=tlsv1.1

ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
ssl_options.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
ssl_options.ciphers.4 = ECDHE-RSA-AES256-SHA384
ssl_options.ciphers.5 = ECDHE-ECDSA-DES-CBC3-SHA
ssl_options.ciphers.6 = ECDH-ECDSA-AES256-GCM-SHA384
ssl_options.ciphers.7 = ECDH-RSA-AES256-GCM-SHA384
ssl_options.ciphers.8 = ECDH-ECDSA-AES256-SHA384
ssl_options.ciphers.9 = ECDH-RSA-AES256-SHA384
ssl_options.ciphers.10 = DHE-DSS-AES256-GCM-SHA384
ssl_options.ciphers.11= DHE-DSS-AES256-SHA256
ssl_options.ciphers.12 = AES256-GCM-SHA384
ssl_options.ciphers.13 = AES256-SHA256
ssl_options.ciphers.14 = ECDHE-ECDSA-AES128-GCM-SHA256
ssl_options.ciphers.15 = ECDHE-RSA-AES128-GCM-SHA256
ssl_options.ciphers.16 = ECDHE-ECDSA-AES128-SHA256
ssl_options.ciphers.17 = ECDHE-RSA-AES128-SHA256
ssl_options.ciphers.18 = ECDH-ECDSA-AES128-GCM-SHA256
ssl_options.ciphers.19= ECDH-RSA-AES128-GCM-SHA256
ssl_options.ciphers.20 = ECDH-ECDSA-AES128-SHA256
ssl_options.ciphers.21 = ECDH-RSA-AES128-SHA256
ssl_options.ciphers.22 = DHE-DSS-AES128-GCM-SHA256
ssl_options.ciphers.23 = DHE-DSS-AES128-SHA256
ssl_options.ciphers.24 = AES128-GCM-SHA256
ssl_options.ciphers.25 = AES128-SHA256
ssl_options.ciphers.26 = ECDHE-ECDSA-AES256-SHA
ssl_options.ciphers.27 = ECDHE-RSA-AES256-SHA
ssl_options.ciphers.28 = DHE-DSS-AES256-SHA
ssl_options.ciphers.29 = ECDH-ECDSA-AES256-SHA
ssl_options.ciphers.30 = ECDH-RSA-AES256-SHA
ssl_options.ciphers.31= AES256-SHA
ssl_options.ciphers.32 = ECDHE-ECDSA-AES128-SHA
ssl_options.ciphers.33 = ECDHE-RSA-AES128-SHA
ssl_options.ciphers.34 = DHE-DSS-AES128-SHA
ssl_options.ciphers.35 = DHE-DSS-AES128-SHA256
ssl_options.ciphers.36 = ECDH-ECDSA-AES128-SHA
ssl_options.ciphers.37 = ECDH-RSA-AES128-SHA
ssl_options.ciphers.38 = AES128-SHA

auth_mechanisms.1 = EXTERNAL # 使用rabbit-ssl插件进行认证 首先要配置SSL插件
#auth_mechanisms.2 = PLAIN # 明文
#auth_mechanisms.3 = AMQPLAIN # 明文
management.tcp.port = 15672
ssl_cert_login_from = common_name # 使用证书种的CN作为登录用户名
loopback_users.guest = false
default_pass = Rabbit@123
default_user = admin

验证证书有效性

# 进入生成的目录下,通过证书连接rabbit
openssl s_client -connect localhost:5671 \
  -cert client/rabbitmq-client.cert.pem \
  -key client/rabbitmq-client.key.pem \
  -CAfile ca/cacert.pem

遇到问题&注意事项

  1. 部署在服务器上的rabbit 5671端口一直无法telnet通,因为忘记配防火墙的5671端口了。。。
  2. rabbit忘记创建证书登录用户,无法连接
  3. 没有配置ssl_cert_login_from,就无法从证书用户进行登录
  4. 不能在本地生成然后上传到服务器,必须在服务器生成,下载客户端密钥到本地

Springboot连接测试

  • 代码示例https://github.com/hellxz/rabbitmq-ssl-demo

主要配置文件

server.port=8085
#基础配置请根据实际配置,此种配置方式无需配置用户名与密码
spring.rabbitmq.host=
#ssl协议端口
spring.rabbitmq.port=5671
spring.rabbitmq.virtual-host=/
#启用rabbitmq客户端SSL连接
spring.rabbitmq.ssl.enabled=true
#客户端PKCS12证书及密码
spring.rabbitmq.ssl.key-store=classpath:ssl/rabbitmq-client.keycert.p12
spring.rabbitmq.ssl.key-store-password=123456
#公钥证书及类型
spring.rabbitmq.ssl.trust-store=classpath:ssl/rabbitmqStore
spring.rabbitmq.ssl.trust-store-password=123456
spring.rabbitmq.ssl.trust-store-type=JKS
#不校验主机名,默认开启会导致连接失败
spring.rabbitmq.ssl.verify-hostname=false

amqp明文身份验证,SSL,TLS,RabbitMQ,spring boot,java-rabbitmq,rabbitmq

参考文献

[1] https://blog.csdn.net/u012586326/article/details/122373289
[2] https://blog.freessl.cn/ssl-cert-format-introduce/
[3] https://www.cnblogs.com/ybyn/p/13959135.html
[4] https://www.rabbitmq.com/ssl.html文章来源地址https://www.toymoban.com/news/detail-623184.html

到了这里,关于禁用AMQP配置中的明文身份验证机制(包含Springboot结果测试+踩坑)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring中的Websocket身份验证和授权

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 http和WebSocket的安全链和安全配置是完全独立的。 SpringAuthenticationProvider根本不参与 Websocket 身份验证。 将要给出的示例中,身份验证不会发生在 HTTP 协商端点上,因

    2024年02月13日
    浏览(51)
  • npm 配置双因素身份验证

    目录 1、关于双因素身份验证 2、NPM上的双因素身份验证 2.1 授权和写入 2.2 仅限授权 3、先决条件 4、从网站配置2FA 4.1 启用2FA 4.2 为写入禁用2FA 4.3 禁用2FA 5、从命令行配置2FA 5.1 从命令行启用2FA 5.2 从命令行发送一次性密码 5.3 从命令行删除2FA 6、配置帐户恢复选项 今天收到一

    2024年02月07日
    浏览(38)
  • Java开发 微软OAuth身份验证在EWS中的应用

    一、使用说明 看到有朋友在评论区咨询Java通过Oauth2.0调用EWS的实现。所以有了这篇文章,大概思路是使用Azure的客户端账号和密码通过http方式获取到Token信息,再通过Token去初始化ExchangeService实例,再通过各项API完成各种功能的调用。 二、HTTP方式获取Ews的Token信息 配置文件

    2024年02月16日
    浏览(55)
  • postman通过脚本配置动态token身份验证

    就是你的token过期了,我只要点一下登录接口 而不是点了登录接口然后还复制token出来又手动去设置token 逻辑是这样的 1. 登录的时候获取 token - 并且设置到全局变量 token 中 2. 设置项目的一个前置中间件 - 项目中所有的接口请求之前都会走这个前置中间件 3. 前置中间件设置

    2024年02月05日
    浏览(50)
  • Cookie vs Session:Web开发中的身份验证之争

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 当涉及到Web开发和用户身份验证时,Cookie和Session是两个常见的概念。它们在存储和管理用户状态方

    2024年02月14日
    浏览(36)
  • python之app逆向破解headers中的Authorization 身份验证 AES

    下载好app 贝壳 2018-5-2 版本 1.还是先抓包 注册入口 2.用jadx-gui打开 直接用jadx-gui打开,因为没有加壳 并搜索Authorization 点击右键 查找用例 3.开始Hook 从以下可以看出: 由 Appid + COLON_SEPARATOR + c 组成的,最后 Base64 所以从第一个入参开始跟踪 String encodeToString = Base64.encodeToStri

    2024年02月03日
    浏览(39)
  • kafka2.x版本配置SSL进行加密和身份验证

    背景:找了一圈资料,都是东讲讲西讲讲,最后我还没搞好,最终决定参考官网说明。 官网指导手册地址:Apache Kafka 需要预备的知识,keytool和openssl 关于keytool的参考:keytool的使用-CSDN博客 关于openssl的参考:openssl常用命令大全_openssl命令参数大全-CSDN博客 先只看SSL安全机制

    2024年03月22日
    浏览(40)
  • 多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

    对用户表扩展手机号码字段,允许用户通过手机号码与验证码的方式进行认证,注册,重置密码以及更换手机号。 多因素身份认证 (MFA) 是保护企业 IT 资源访问安全的一种关键工具,也是零信任安全模型的核心组成。特别在远程办公以及数据泄露事件层出不穷的背景下,越来

    2024年02月09日
    浏览(53)
  • 如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

    前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 SSH是一种加密协议,用于管理服务器并与服务器通信。虽然登录 SSH 服务器的方式有多种,下面我们将重点关注设置 SSH 密钥。 SSH 密钥提供了一

    2024年01月23日
    浏览(60)
  • git拉取提交代码进行身份验证-输入账号密码以及配置SSH公钥

    git初次拉取代码或者提交代码时,需要进行身份验证。验证有两种方式:1、账号密码验证;2、SSH公钥验证。 本文章以gitee为例 1.首先找到电脑本地项目文件夹,在地址栏中输入 cmd 回车,打开命令行窗口。 2.输入 git clone 要拉取的项目地址,回车,一会弹出输入账号密码的对

    2024年02月12日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包