RabbitMQ要对外提供服务,考虑到安全性,配置SSL进行访问,ssl端口5671,内部仍然使用5672进行访问,两者同时兼容。

安装环境

  • CentOS 7.5
  • Docker 1.13.1
  • Git 1.8.3
  • jdk 1.8
  • RabbitMQ镜像,rabbitmq:management

证书

RabbitMQ也提供了获取证书的方案,但是使用过程中出现错误,未来得及进行解决,在github上查找到一个项目可以生成证书,遂使用之。

安装git

要从github上将项目克隆下来,需要有git环境,安装步骤如下


  1. # yum安装git
  2. $ yum -y install git
  3. # 配置邮箱以及账号
  4. $ git config --global user.name = 'xxx'
  5. $ git config --global user.email = 'xxx'
  6. # 查看git配置
  7. $ git config --list

生成证书

1.从github上克隆项目

  1. $ git clone https://github.com/Berico-Technologies/CMF-AMQP-Configuration.git

2.下载完成后,进入CMF-AMQP-Configuration/ssl/目录

  1. $ cd CMF-AMQP-Configuration/ssl/

3.生成证书签发机构

  1. $ sh setup_ca.sh xxx

xxx为自定义的证书签发机构名称,该脚本会在当前目录下生成一个ca目录,存储证书颁发机构的信息以及已经签发的一些证书

执行脚本后的ca目录如下所示

4.生成服务端公钥和私钥

  1. $ sh make_server_cert.sh rabbit-server 123456

注释:

rabbit-server:生成的密钥前缀名,自定义

123456: 访问该密钥的密码,自定义

执行该脚本后,在当前目录生成server目录,存储服务端公钥和私钥,如下所示

5.生成客户端公钥和私钥

  1. $ sh create_client_cert.sh rabbit-client 123456

注释:

rabbit-client:生成的密钥前缀名,自定义。

123456: 访问该密钥的密码,自定义。

执行该脚本后,在当前目录下生成client目录,存储客户端公钥和私钥,如下所示

6.生成客户端需要的证书

使用java的keytool工具生成客户端需要的证书,用以支持服务端和客户端进行通信,生成该证书需要提前安装配置java环境,此处默认已正确安装java环境,不会安装的可以参考本人博客

  1. $ keytool -import -alias rabbit-server -file server/rabbit-server.cert.pem -keystore rabbitStore -storepass 123456

注释:

-import 将已签名数字证书导入密钥库 

-alias xxx 指定导入条目的别名

-file server/rabbit-server.cert.pem 需要导入的证书

-keystore xxx 指定密钥库的名称

-storepass xxx 指定密钥库的密码(获取keystore信息所需的密码)

经过以上6个步骤,我们一共生成了3个文件夹以及1个文件,分别是server/,client/,ca/以及rabbitStore证书,只要以上几个文件都存在,那么就表示生成证书成。

安装RabbitMQ并配置SSL

1.拉取management版本的镜像

  1. $ docker pull rabbitmq:management

2.先使用以下命令启动容器

  1. $ docker run --restart=unless-stopped -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

3.创建文件夹

在宿主机上创建以下文件夹

  1. $ mkdir -p /etc/rabbitmq/ssl

4.拷贝容器中的文件到/etc/rabbitmq/目录下

  1. $ docker cp rabbitmq:/etc/rabbitmq/conf.d /etc/rabbitmq/
  2. $ docker cp rabbitmq:/etc/rabbitmq/enabled_plugins /etc/rabbitmq/
  3. $ docker cp rabbitmq:/etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/

5.拷贝生成的证书到/etc/rabbitmq/ssl/目录下

在./CMF-AMQP-Configuration/ssl/目录下执行以下命令

  1. $ cp -r ca server client rabbitStore /etc/rabbitmq/ssl

6.编辑/etc/rabbitmq/rabbitmq.conf文件,输入以下内容


  1. # SSL\TLS通信的端口
  2. listeners.ssl.default=5671
  3. # 服务端私钥和证书文件配置
  4. ssl_options.cacertfile=/etc/rabbitmq/ssl/ca/cacert.pem
  5. ssl_options.certfile=/etc/rabbitmq/ssl/server/rabbit-server.cert.pem
  6. ssl_options.keyfile=/etc/rabbitmq/ssl/server/rabbit-server.key.pem
  7. # 有verify_none和verify_peer两个选项,verify_none表示完全忽略验证证书的结果,verify_peer表示要求验证对方证书
  8. ssl_options.verify=verify_peer
  9. # 若为true,服务端会向客户端索要证书,若客户端无证书则中止SSL握手;若为false,则客户端没有证书时依然可完成SSL握手
  10. ssl_options.fail_if_no_peer_cert=true
  11. ssl_options.versions.1=tlsv1.2
  12. ssl_options.versions.2=tlsv1.1
  13. ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
  14. ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
  15. ssl_options.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
  16. ssl_options.ciphers.4 = ECDHE-RSA-AES256-SHA384
  17. ssl_options.ciphers.5 = ECDHE-ECDSA-DES-CBC3-SHA
  18. ssl_options.ciphers.6 = ECDH-ECDSA-AES256-GCM-SHA384
  19. ssl_options.ciphers.7 = ECDH-RSA-AES256-GCM-SHA384
  20. ssl_options.ciphers.8 = ECDH-ECDSA-AES256-SHA384
  21. ssl_options.ciphers.9 = ECDH-RSA-AES256-SHA384
  22. ssl_options.ciphers.10 = DHE-DSS-AES256-GCM-SHA384
  23. ssl_options.ciphers.11= DHE-DSS-AES256-SHA256
  24. ssl_options.ciphers.12 = AES256-GCM-SHA384
  25. ssl_options.ciphers.13 = AES256-SHA256
  26. ssl_options.ciphers.14 = ECDHE-ECDSA-AES128-GCM-SHA256
  27. ssl_options.ciphers.15 = ECDHE-RSA-AES128-GCM-SHA256
  28. ssl_options.ciphers.16 = ECDHE-ECDSA-AES128-SHA256
  29. ssl_options.ciphers.17 = ECDHE-RSA-AES128-SHA256
  30. ssl_options.ciphers.18 = ECDH-ECDSA-AES128-GCM-SHA256
  31. ssl_options.ciphers.19= ECDH-RSA-AES128-GCM-SHA256
  32. ssl_options.ciphers.20 = ECDH-ECDSA-AES128-SHA256
  33. ssl_options.ciphers.21 = ECDH-RSA-AES128-SHA256
  34. ssl_options.ciphers.22 = DHE-DSS-AES128-GCM-SHA256
  35. ssl_options.ciphers.23 = DHE-DSS-AES128-SHA256
  36. ssl_options.ciphers.24 = AES128-GCM-SHA256
  37. ssl_options.ciphers.25 = AES128-SHA256
  38. ssl_options.ciphers.26 = ECDHE-ECDSA-AES256-SHA
  39. ssl_options.ciphers.27 = ECDHE-RSA-AES256-SHA
  40. ssl_options.ciphers.28 = DHE-DSS-AES256-SHA
  41. ssl_options.ciphers.29 = ECDH-ECDSA-AES256-SHA
  42. ssl_options.ciphers.30 = ECDH-RSA-AES256-SHA
  43. ssl_options.ciphers.31= AES256-SHA
  44. ssl_options.ciphers.32 = ECDHE-ECDSA-AES128-SHA
  45. ssl_options.ciphers.33 = ECDHE-RSA-AES128-SHA
  46. ssl_options.ciphers.34 = DHE-DSS-AES128-SHA
  47. ssl_options.ciphers.35 = DHE-DSS-AES128-SHA256
  48. ssl_options.ciphers.36 = ECDH-ECDSA-AES128-SHA
  49. ssl_options.ciphers.37 = ECDH-RSA-AES128-SHA
  50. ssl_options.ciphers.38 = AES128-SHA

注释:

rabbitmq.conf文件中原有的内容可以直接删除掉,也可以保留,不影响

也可以不使用上述的rabbitmq.conf文件,而使用rabbitmq.config文件,不过后者需要自己创建,且不可以和rabbitmq.conf共存,RabbitMQ3.7版本以后,推荐使用rabbitmq.conf,因此如果要使用rabbitmq.config,需要先创建,再写入内容

  1. # 创建rabbitmq.config文件
  2. $ vim rabbitmq.config
  3. # 输入以下内容保存
  4. %%Disable SSLv3.0 and TLSv1.0 support.
  5. [
  6. {ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
  7. {rabbit, [
  8. {tcp_listeners, [5672]},
  9. {ssl_listeners, [5671]},
  10. {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/ca/cacert.pem"},
  11. {certfile,"/etc/rabbitmq/ssl/server/rabbit-server.cert.pem"},
  12. {keyfile,"/etc/rabbitmq/ssl/server/rabbit-server.key.pem"},
  13. {verify, verify_peer},
  14. {ciphers, ["ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384",
  15. "ECDHE-ECDSA-AES256-SHA384","ECDHE-RSA-AES256-SHA384", "ECDHE-ECDSA-DES-CBC3-SHA",
  16. "ECDH-ECDSA-AES256-GCM-SHA384","ECDH-RSA-AES256-GCM-SHA384","ECDH-ECDSA-AES256-SHA384",
  17. "ECDH-RSA-AES256-SHA384","DHE-DSS-AES256-GCM-SHA384","DHE-DSS-AES256-SHA256",
  18. "AES256-GCM-SHA384","AES256-SHA256","ECDHE-ECDSA-AES128-GCM-SHA256",
  19. "ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES128-SHA256","ECDHE-RSA-AES128-SHA256",
  20. "ECDH-ECDSA-AES128-GCM-SHA256","ECDH-RSA-AES128-GCM-SHA256","ECDH-ECDSA-AES128-SHA256",
  21. "ECDH-RSA-AES128-SHA256","DHE-DSS-AES128-GCM-SHA256","DHE-DSS-AES128-SHA256",
  22. "AES128-GCM-SHA256","AES128-SHA256","ECDHE-ECDSA-AES256-SHA",
  23. "ECDHE-RSA-AES256-SHA","DHE-DSS-AES256-SHA","ECDH-ECDSA-AES256-SHA",
  24. "ECDH-RSA-AES256-SHA","AES256-SHA","ECDHE-ECDSA-AES128-SHA",
  25. "ECDHE-RSA-AES128-SHA","DHE-DSS-AES128-SHA","ECDH-ECDSA-AES128-SHA",
  26. "ECDH-RSA-AES128-SHA","AES128-SHA"]},
  27. {honor_cipher_order, true},
  28. {fail_if_no_peer_cert, true},
  29. {versions, ['tlsv1.2', 'tlsv1.1']}
  30. ]},
  31. {auth_mechanisms,['PLAIN', 'AMQPLAIN', 'EXTERNAL']}
  32. ]}
  33. ].

注释:

rabbitmq.conf和rabbitmq.config任选其一即可,个人认为前者可读性更好一些,但是编写的内容相对较多一些

7.删除前面创建的rabbitmq容器,重新创建

使用以下命令重新创建rabbitmq容器,添加5671端口映射以及/etc/rabbitmq/文件夹的挂载

  1. $ docker run --restart=unless-stopped -d \
  2. -p 5672:5672 -p 15672:15672 -p 5671:5671 \
  3. -v /etc/rabbitmq/:/etc/rabbitmq/ \
  4. --name rabbitmq \
  5. rabbitmq:management

8.验证5671端口

使用以下命令查看rabbitmq容器启动时的日志

  1. $ docker logs -f rabbitmq

看到日志中出现以下内容表示配置成功

9.创建可以远程访问的用户

由于guest用户只能本地访问,因此需要创建一个可以远程访问的用户

  1. # 进入容器内部
  2. $ docker exec -it rabbitmq bash
  3. # 创建一个用户名为admin,密码为123456的用户
  4. $ rabbitmqctl add_user admin 123456
  5. # 设置用户权限为超级管理员
  6. $ rabbitmqctl set_user_tags admin administrator
  7. # 授权远程访问
  8. $ rabbitmqctl set_permissions -p / admin "." "." ".*"
  9. # 退出容器
  10. $ exit
  11. # 重启rabbitmq
  12. $ docker restart rabbitmq

10.访问管理页面

此时可以使用上面创建的admin用户远程访问管理页面,地址为http://ip:15672

进入之后可以通过如下方式确认ssl是否配置成功

SpringBoot集成SSL

此处只给出配置ssl的部分,springboot集成rabbitmq的方法可以参考本人博客

  1. spring:
  2. rabbitmq:
  3. addresses: 192.168.216.129:5671
  4. username: admin
  5. password: 123456
  6. virtual-host: /
  7. ssl:
  8. enabled: true
  9. key-store: classpath:keyStore/129/rabbit-client.keycert.p12
  10. key-store-password: 123456
  11. trust-store: classpath:keyStore/129/rabbitStore
  12. trust-store-password: 123456
  13. algorithm: TLSv1.2
  14. trust-store-type: JKS
  15. key-store-type: PKCS12
  16. validate-server-certificate: true
  17. verify-hostname: false

注释:

addresses: 192.168.216.129:5671 ssl使用的是5671的端口,如果不使用ssl还可以使用5672端口

ssl.enabled 是否启用ssl,默认false

key-store: 客户端证书的存储路径,前面已经生成,直接拷贝过来即可

key-store-password: 生成客户端证书的密码

trust-store: 信任证书的存储路径,前面已经生成,直接拷贝过来即可

trust-store-password:生成证书的密码

verify-hostname:是否验证hostname,默认是true,需要设置为false,否则启动报错(No subject alternative names present),原因是证书中定义的common name和程序运行的机器的domain不匹配,这个感觉没有必要纠结,直接设置为false即可。

参考文档

1.RabbitMQ 配置 SSL/TSL

2.RMQ的SSL配置最佳实践

Docker环境RabbitMq配置SSL的更多相关文章

  1. 在已部署好的docker环境下配置nginx项目路径

    第一步:申请一个docker连接账号,可以借用putty工具,如果使用sublime,可以下载sftp插件,上传.下载来同步你线上线下的文件: 第二步:修改nginx区域配置文件,在conf文件夹里放 ...

  2. Nginx环境下配置PHP使用的SSL认证(https)

    最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说c ...

  3. Windows中 RabbitMQ安装与环境变量配置

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.1:安装RabbitMQ需要先安装Erlang语言开发包.下载地址 ht ...

  4. npm私有仓库 配置verdaccio在docker环境

    前端开发过程中,少不了自己封装一些通用的包,但又不想放在公共的平台,所以搭建一个npm私有的仓库是很有必要的. 在这里简单介绍如何使用 verdoccio 在docker环境下的配置.verdocci ...

  5. spring boot profiles 实现多环境下配置切换 docker版

    1,前言 开发环境总需要调试,docker直接部署不需要调试,环境配置不一样,这里的目的只是,在docker文件环境与开发环境使用不同的配置文件,项目结构如下 2,设置项目配置文件 默认配置文件 ap ...

  6. docker环境下solr6.0配置(中文分词+拼音)

    前言:这篇文章是基于之前的“linux环境下配置solr5.3详细步骤”(http://www.cnblogs.com/zhangyuan0532/p/4826740.html)进行扩展的.本篇的步骤 ...

  7. windows Apache 环境下配置支持HTTPS的SSL证书

    windows Apache 环境下配置支持HTTPS的SSL证书 1.准备工作 1)在设置Apache + SSL之前, 需要做: 安装Apache, 下载安装Apache时请下载带有SSL版本的A ...

  8. Mac+Docker环境下xdebug的配置

    由于容器化的需要,前几天我本地也换成了docker环境.就研究了一下docker环境下phpstorm和xdebug的配置. http://www.mmfei.com/?p=453 这个博客给出了一个 ...

  9. CentOS 7下设置Docker代理(Linux下Systemd服务的环境变量配置)

    Docker守护程序使用HTTP_PROXY,HTTPS_PROXY以及NO_PROXY环境变量在其启动环境来配置HTTP或HTTPS代理的行为.无法使用daemon.json文件配置这些环境变量. ...

随机推荐

  1. WPF中Grid容器中VerticalAlignment和HorizonAlignment和Margin的关系。

    在WPF中,经常使用Grid容器,来布局我们想要显示的对象. 这就不可避免的要和布局在其中的控件的VerticalAlignment特性,HorizonAlignment特性,以及Magin特性打交道 ...

  2. C语言编译器开发之旅(开篇)

    编译器写作之旅   最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...

  3. Redis(二) 数据类型操作指令以及对应的RedisTemplate方法

    1.Redis key值操作以及RedisTemplate对应的API 本文默认使用RedisTemplate,关于RedisTemplate和StringRedisTemplate的区别如下 Red ...

  4. 鱼眼摄像头SLAM

    鱼眼摄像头SLAM 在机器人技术.摄影测量学和计算机视觉等领域,鲁棒相机位姿估计是许多视觉应用的核心.近年来,在复杂.大规模的室内外环境中,人们越来越关注相机位姿估计方法的实时性.通用性和可操作性.其 ...

  5. python+selenium基础篇,切入切出frame

    1.首先制作一个html的文件,代码如下 <!DOCTYPE html> <html> <head> <title>Frame_test</tit ...

  6. [论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding

    [论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 ...

  7. pytest命令行参数

    1.-v:可以输出用例更加详细的执行信息,如下图 C:\Users\cale\checkapi\test_cc>pytest test_m1.py -v ==================== ...

  8. 导出 Excel 模板自动生成规则,避免用户来回修改

    一句话总结 Excel 导出.导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入. ...

  9. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

  10. Spring Cloud Alibaba(15)---Sleuth+Zipkin

    SpringCloudAlibaba整合Sleuth+Zipkin 有关Sleuth之前有写过两篇文章 Spring Cloud Alibaba(13)---Sleuth概述 Spring Cloud ...