记忆角落

  • {{ item.name }}
  • RabbitMQ开启SSL与SpringBoot连接测试
  • 配置 RabbitMQ 开启 SSL
  • 下载证书生成器,方便咱们生成证书
  • 配置 RabbitMQ 服务端的证书如下:
  • 使用 RabbitMQ 服务端公钥证书生成 JKS 证书
  • 配置 RabbitMQ 客户端的证书如下:
  • 默认 RabbitMQ 配置目录在 /etc/rabbitmq,我们创建个证书目录存放服务端证书
  • 修改 RabbitMQ 配置文件
  • 重启 RabbitMQ
  • 验证开启 SSL 是否成功
  • 使用 OpenSSL CLI 工具验证证书是否有效
  • SpringBoot连接测试
  • 首页
  • 关于
  • 归档
  • 邻居
  • 捐赠

RabbitMQ开启SSL与SpringBoot连接测试

  • 郭良俊只狗
  • 2023-02-17
  • 1

RabbitMQ开启SSL与SpringBoot连接测试

最近有一个需求,需要RabbitMQ开启ssl连接进行消费,之前因为生产也是直接内网部署,因此没考虑过ssl加密访问,因此这又是我的一个小知识点(漠叔的语气)

配置 RabbitMQ 开启 SSL

前提是已经部署了RabbitMQ ,我这边是单机测试,https://199604.com/2323可以参考此文档进行部署单机。

下载证书生成器,方便咱们生成证书

地址:https://github.com/Novetta/CMF-AMQP-Configuration

下载上传解压~

unzip CMF-AMQP-Configuration-master.zip
cd CMF-AMQP-Configuration-master/ssl
#生成ca证书,“rabbitmqca”为自定义名称,名称任意。在当前目录下生成ca目录,默认证书是一年,可以修改setup_ca.sh脚本的valid值,改变时间
sh setup_ca.sh rabbitmqca
#生成服务端证书,第一个参数是服务端证书前缀,第二个参数是密码。密码任意,在当前目录下生成server目录
sh make_server_cert.sh rabbitmq-server rabbitmqca-server-passwd
#生成客户端证书,第一个参数是客户端证书前缀,第二个参数是密码。密码任意,在当前目录下生成client目录
sh create_client_cert.sh rabbitmq-client rabbitmqca-client-passwd

配置 RabbitMQ 服务端的证书如下:

ca/cacert.pem #CA证书
server/rabbitmq-server.cert.pem #服务端公钥
server/rabbitmq-server.key.pem  #服务端私钥

使用 RabbitMQ 服务端公钥证书生成 JKS 证书

# -alias后为别称,-file后是服务端公钥位置,-keystore后是输出JSK证书位置,此处相对路径 mykeystore
keytool -import -alias rabbitmq-server \
  -file server/rabbitmq-server.cert.pem \
  -keystore mykeystore -storepass changeit

配置 RabbitMQ 客户端的证书如下:

client/rabbitmq-client.keycert.p12 #PKCS12证书,包含客户端所需公私钥及中间证书
mykeystore #服务端JKS格式公钥

默认 RabbitMQ 配置目录在 /etc/rabbitmq,我们创建个证书目录存放服务端证书

mkdir -p /etc/rabbitmq/ssl
#复制服务端必要证书
cp ca/cacert.pem \
server/rabbitmq-server.cert.pem \
server/rabbitmq-server.key.pem /etc/rabbitmq/ssl/

修改 RabbitMQ 配置文件

修改 RabbitMQ 配置文件 /etc/rabbitmq/rabbitmq.config,此文件默认不存在,需要手动创建

# SSL\TLS通信的端口
listeners.ssl.default=5671
# 服务端私钥和证书文件配置
ssl_options.cacertfile=/etc/rabbitmq/ssl/cacert.pem
ssl_options.certfile=/etc/rabbitmq/ssl/rabbit-server.cert.pem
ssl_options.keyfile=/etc/rabbitmq/ssl/rabbit-server.key.pem

# 有verify_none和verify_peer两个选项,verify_none表示完全忽略验证证书的结果,verify_peer表示要求验证对方证书
ssl_options.verify=verify_peer
# 若为true,服务端会向客户端索要证书,若客户端无证书则中止SSL握手;若为false,则客户端没有证书时依然可完成SSL握手
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

主要配置项说明:

  • ssl_listeners 指定 SSL协议的端口号,官方文档 5671
  • ssl_options SSL 认证配置项
  • cacertfile CA 证书位置
  • certfile 公钥证书位置
  • keyfile 密钥证书位置
  • verify
  • verify_peer 客户端与服务端互相发送证书
  • verify_none 禁用证书交换与校验
  • fail_if_no_peer_cert
  • true 不接受没证书的客户端连接
  • false 接受没证书的客户端连接
  • ciphers 加密器

重启 RabbitMQ

systemctl restart rabbitmq-server

验证开启 SSL 是否成功

使用 Rabbitmq 自带的诊断工具查看端口监听状态及使用协议

#查看监听
rabbitmq-diagnostics listeners
#查看支持的TLS版本
rabbitmq-diagnostics --silent tls_versions

image-20230217084003341

使用 OpenSSL CLI 工具验证证书是否有效

cd 生成证书的ssl目录
#使用客户端证书+CA证书连接RabbitMQ验证。本处MQ与生成证书是同一主机,其他情况请自行考虑。
openssl s_client -connect localhost:5671 \
  -cert client/rabbitmq-client.cert.pem \
  -key client/rabbitmq-client.key.pem \
  -CAfile ca/cacert.pem

image-20230217084048282

SpringBoot连接测试

配置文件 application.properties

image-20230217084249091

剩下代码就是自己测试推送是否成功

image-20230217084451915

image-20230217084530320

生产者推送消息成功,同理消费者也是配置上ssl相关信息即可。

© 2012 - 2023 记忆角落 网站统计
Theme by Wing
粤ICP备14056850号-1 又拍云CDN赞助