如果RabbitMQ服务在内网中,只有内网的应用连接,我们认为这些连接都是安全的,但是个别情况我们需要让RabbitMQ对外提供服务。这种情况有两种解决方案:
在RabbitMQ外层在封装一层应用,应用对外提供服务,本质来说RabbitMQ还是只对内网提供服务。相对更安全,但灵活性差。
RabbitMQ直接对外提供服务。这时除了服务本身的安全性还要考虑数据在互联网传输过程中是否可能被拦截破解。业界标准的解决方案就是SSL。
生成证书
首先确保已经安装好openssl,通常在安装WEB运行环境时都会自动安装。我就找了我之前的一个WEB服务器。
检测方法:
openssl version
我在github上发现了一个可以自动生成证书的项目,通过这些shell脚本方便生成证书,项目github地址为:
https://github.com/Berico-Technologies/CMF-AMQP-Configuration
下载之后上传到安装openssl的服务器中
切换到CMF-AMQP-Configuration/ssl 文件夹,并运行
sh setup_ca.sh MyRabbitMQCA
名称定义为”MyRabbitMQCA”,这个名字可以自行指定,用于在证书中显示证书颁发机构名。
- 生成服务器证书
sh make_server_cert.sh rabbitmq-server rabbit
一个参数是服务器名,第二个参数是密码。
- 生成客户端证书
sh create_client_cert.sh rabbit-client rabbit
第一个参数是客户端名称,第二个参数是密码。
执行完以上步骤之后,会在ssl目录下生成:ca、server、client三个文件夹。
配置RabbitMQ Server用到的三个文件如下:
配置RabbitMQ SSL只会用到以下3个文件:
ca/cacert.pem
server/rabbitmq-server.cert.pem
server/rabbitmq-server.key.pem
将这三个文件拷贝到RabbitMQ的/usr/local/rabbitmq/ssl/目录中。
配置RabbitMQ开启SSL
在WEB控制台中可以看到rabbitmq.config的地址,如果没有就新建这个文件
vi /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.config
[
{rabbit, [
{tcp_listeners, [5672]},
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"/usr/local/rabbitmq/ssl/cacert.pem"},
{certfile,"/usr/local/rabbitmq/ssl/rabbitmq-server.cert.pem"},
{keyfile,"/usr/local/rabbitmq/ssl/rabbitmq-server.key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, true}
]}
]}
].
ssl_listeners 指定SSL监听5671端口。
fail_if_no_peer_cert 意思是是否强制验证证书。
- 重启RabbitMQ
rabbitmqctl stop
rabbitmq-server -detached
- 查看是否开启
RabbitMQ技术交流QQ群:327034977(添加时请备注RabbitMQ)