RabbitMQ + TSL 实现安全访问 2021-10-18 程序之旅 暂无评论 1023 次阅读 ## RabbitMQ + TSL 实现安全访问 前段时间,公司有台服务器需要安装 RabbitMQ 进行消息传输,对 MQ 服务的安全有着严格的要求。 - RabbitMQ 版本需要大于等于 3.6.9 - 不能使用 guest 用户 - 要求暴露外网的端口需要有 SSL 安全协议 这里就简单说说用户的配置与端口 SSL 的配置,如果大家配置自签证书出现问题,并且无法解决,可以尝试我的方法。 ### 配置环境 - RabbitMQ 3.8.1 - SpringBoot 2.2.6.RELEASE #### maven 配置 ```xml org.springframework.boot spring-boot-starter-amqp ``` ### 用户的配置 ```shell # 查看 rabbitmq 有关用户的命令 $ rabbitmqctl help | grep user add_user Creates a new user in the internal database authenticate_user Attempts to authenticate a user. Exits with a non-zero code if authentication fails. change_password Changes the user password clear_password Clears (resets) password and disables password login for a user delete_user Removes a user from the internal database. Has no effect on users provided by external backends such as LDAP list_users List user names and tags set_user_tags Sets user tags clear_permissions Revokes user permissions for a vhost clear_topic_permissions Clears user topic permissions for a vhost or exchange list_permissions Lists user permissions in a virtual host list_user_permissions Lists permissions of a user across all virtual hosts list_user_topic_permissions Lists user topic permissions set_permissions Sets user permissions for a vhost set_topic_permissions Sets user topic permissions for an exchange set_operator_policy Sets an operator policy that overrides a subset of arguments in user policies # 创建用户 admin, 密码是 *** $ rabbitmqctl add_user admin *** # 设置 admin 为超级管理员 $ rabbitmqctl set_user_tags admin administrator # 授权远程访问 $ rabbitmqctl set_permissions -p / admin "." "." ".*" # 删除 guest 用户 $ rabbitmqctl delete_user guest # 启动后台插件 $ rabbitmq-plugins enable rabbitmq_management $ rabbitmqctl stop $ rabbitmq-server -detached ``` 如果不习惯使用命令行,可以直接登录 web 管理界面进行配置。 ![image-20211018232311456](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20211018232311456.png) ### 服务器端口 SSL 的配置 按照网络上的步骤,自签 CA 证书,生成服务器和客户端公私钥,之后进行程序连接。但是我这里试了多遍,还是出现问题,找了一天都没能很好解决。最后不按照他们的流程,自行按照自己的想法去做,得以解决问题。官网的配置步骤也挺详细,可以[参考地址](https://www.rabbitmq.com/ssl.html)。 首先我们要知道了解现有的证书之间的关系,最后才能准确的知道我们到底需要些什么。这里推荐一篇博文--[各种安全证书间的关系及相关操作](http://events.jianshu.io/p/96df7de54375) 很明显,在官网的推荐中,我们使用的是 Base64 编码的证书(PEM)。PEM 它的形式为:`-----BEGIN XXXX-----`,与结尾的 `-----END XXXX-----` 对应。具有 `.pem,.crt, .cer, .key` 这样的扩展名。而 rabbitmq 所需要的文件配置有三个,如下 ```shell listeners.ssl.default = 5671 ssl_options.cacertfile = /path/to/ca_certificate.pem ssl_options.certfile = /path/to/server_certificate.pem ssl_options.keyfile = /path/to/server_key.pem ssl_options.verify = verify_peer ssl_options.fail_if_no_peer_cert = true ``` | 配置项 | 描述 | | | -------------------------------- | ------------------------------ | ---- | | listeners.ssl.default | 默认的 TSL 连接端口 | | | ssl_options.cacertfile | 证书颁发机构 (CA) 捆绑文件路径 | | | ssl_options.certfile | 服务器证书文件路径 | | | ssl_options.keyfile | 服务器私钥文件路径 | | | ssl_options.verify | | | | ssl_options.fail_if_no_peer_cert | | | | | | | | | | | RabbitMQ 所使用的是三个证书,与 apache 服务绑定的证书一样,在证书导出的时候选择 apache 证书导出即可。 ![image-20211018234216574](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20211018234216574.png) 导出后会有三个文件,ca_bundle.crt、\*.mufeng.info.crt、\*.mufeng.info_key.key,分别对应 RabbitMQ 中的ssl_options.cacertfile、 ssl_options.certfile、ssl_options.keyfile 所要指定的文件。(crt、key 都是 PEM 格式文件) ![image-20211018234336208](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20211018234336208.png) 注:如果是本地测试,可以在 hosts 中对 127.0.0.1 进行域名映射。 #### RabbitMQ 重启 ```shell $ rabbitmqctl stop $ rabbitmq-server -detached ``` ### SpringBoot 的 RabbitMQ 配置 ```yam spring: rabbitmq: host: *.mufeng.info port: 5671 username: *** password: *** ssl: enabled: true virtual-host: / publisher-confirm-type: correlated ``` 启动后即可连接 RabbitMQ AMQP/SSL。 打赏: 微信, 支付宝 标签: java, rabbitmq, springboot, ssl, tsl 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。