环境准备
RabbitMQ对外提供服务时,为保证通信的安全性,通常使用SSL/TLS加密通信。 关于非对称加密、SSL\TLS协议、证书授权中心(Certificate Authority,CA)可参考其他资料,本文仅演示RabbitMQ SSL\TLS通信的具体操作。对于生成证书,本文使用RabbitMQ官网推荐的tls-gen工具,该工具可在MacOS和Linux系统中使用,要求系统中装有openssl和Python 3.5以上版本。
安装openssl
yum install -y openssl openssl-devel
安装Python 3.5
安装依赖
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
下载安装包
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
tar -xf Python-3.5.0.tgz
cd Python-3.5.0
./configure --prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
测试 输入python3
安装tls-gen生成证书:
# 下载,也可手工从以下网址下载后上传至服务器
git clone https://github.com/michaelklishin/tls-gen tls-gen
cd tls-gen/basic
覆盖 CN(公用名)
make CN=secure.mydomain.local
# 123456是自定义的私钥密码,客户端会用到
make PASSWORD=123456
make verify
make info
证书生成完毕后,会在basic目录下生成result、testca文件夹。 通常使用单向认证的方式进行SSL\TLS通信,所需的文件为: (1)CA的证书文件testca/cacert.cer,C#客户端需要信任签名的CA; (2)CA证书文件result/ca_certificate.pem,用于服务端配置; (3)服务端证书文件result/server_certificate.pem,用于服务端配置; (4)服务端私钥文件result/server_key.pem,用于服务端配置; (5)客户端证书文件result/client_key.p12,用于客户端。
配置rabbitmq.config
在RabbitMQ解压目录的etc/rabbitmq/路径下,加入文件rabbitmq.conf(本文使用新格式配置文件,旧格式相应配置可自行参照官网的示例文件)。该路径为RabbitMQ默认配置文件路径,也可以RABBITMQ_CONFIG_FILE环境变量指定配置文件的路径。 rabbitmq.conf内容:
# SSL\TLS通信的端口
listeners.ssl.default = 5671
# 服务端私钥和证书文件配置
ssl_options.cacertfile = /etc/rabbitmq/ca/result/ca_certificate.pem
ssl_options.certfile =/etc/rabbitmq/ca/result/server_certificate.pem
ssl_options.keyfile = /etc/rabbitmq/ca/result/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
重启rabbitmq