RabbitMQ 配置 SSL/TSL

首先,这篇文章讲的是基于docker安装的rabbitMQ配置SSL,如果你的MQ不是用docker安装的,在配置密钥文件路径的时候,可能方法不太一样。

docker运行RabbitMQ镜像时必须开放5671端口,和映射/etc/rabbitmq/ssl文件,命令如下

1
docker run -itd --name rabbitmq -v /home/rabbitmq/etc/rabbitmq:/etc/rabbitmq -v /home/rabbitmq/lib/rabbitmq:/var/lib/rabbitmq  -v /home/rabbitmq/log/rabbitmq/:/var/log/rabbitmq -v /home/rabbitmq/ssl:/etc/rabbitmq/ssl -p 5671:5671 -p 5672:5672 -p 15672:15672 --privileged=true rabbitmq:management

执行完成后,在home文件夹下会自动创建对应目录。

1
2
3
4
5
运行以下命令查看rabbitmq服务是否启动成功
docker ps -a

如果启动失败,请参照我的另一篇文章,从【第六步】开始看
https://blog.csdn.net/a15940835457/article/details/105405467

第一步,创建文件夹

1
2
3
4
5
6
7
cd /home
mkdir rmpca
cd rmqca
mkdir certs private
chmod 700 private
echo 01 > serial
touch index.txt

第二步,在rmpca文件夹下创建【openssl.cnf】文件。因为-config参数要指定req的配置文件,指定后将忽略所有的其他配置文件。如果不指定则默认使用/etc/pki/tls/openssl.cnf中req段落的值。

openssl.cnf配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[ ca ]
default_ca = rmqca
 
[ rmqca ]
dir = .
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial  

default_crl_days = 7
default_days = 365
default_md = sha256
 
policy = rmqca_policy
x509_extensions = certificate_extensions  

[ rmqca_policy ]
commonName = supplied
stateOrProvinceName = optional
countryName = optional
emailAddress = optional
organizationName = optional
organizationalUnitName = optional  

[ certificate_extensions ]
basicConstraints = CA:false  

[ req ]
default_bits = 2048
default_keyfile = ./private/cakey.pem
default_md = sha256
prompt = yes
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions  

[ root_ca_distinguished_name ]
commonName = hostname  

[ root_ca_extensions ]
basicConstraints = CA:true
keyUsage = keyCertSign, cRLSign  

[ client_ca_extensions ]
basicConstraints = CA:false
keyUsage = digitalSignature
extendedKeyUsage = 1.3.6.1.5.5.7.3.2  

[ server_ca_extensions ]
basicConstraints = CA:false
keyUsage = keyEncipherment
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

这里使用sha256进行加密,sha1已经不安全了,虽然性能会慢200多毫秒,无所谓。

第三步,生成CA证书

1
2
3
4
执行如下两个命令
openssl req -x509 -config openssl.cnf -newkey rsa:2048 -days 365  -out cacert.pem -outform PEM -subj /CN=MyRmqca/ -nodes

openssl x509 -in cacert.pem -out cacert.cer -outform DER

证书生成成功

第四步,生成服务端证书

1
2
3
4
5
6
7
8
9
10
执行如下几个命令
cd ..
mkdir server
cd server
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out req.pem -outform PEM -subj /CN=$(hostname)/O=server/ -nodes
cd ../rmqca
openssl ca -config openssl.cnf -in ../server/req.pem -out ../server/cert.pem -notext -batch -extensions server_ca_extensions
cd ../server
openssl pkcs12 -export -out keycert.p12 -in cert.pem -inkey key.pem -passout pass:MySecretPassword

如果在执行第5个命令出先如下错误

先执行以下命令,再执行上面的第5条命令即可。

1
2
cd /root
openssl rand -writerand .rnd

第五步,生成客户端证书

1
2
3
4
5
6
7
8
9
cd ..
mkdir server
cd server
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out req.pem -outform PEM -subj /CN=$(hostname)/O=server/ -nodes
cd ../rmqca
openssl ca -config openssl.cnf -in ../server/req.pem -out ../server/cert.pem -notext -batch -extensions server_ca_extensions
cd ../server
openssl pkcs12 -export -out keycert.p12 -in cert.pem -inkey key.pem -passout pass:MySecretPassword

第六步,把【rmqca】【server】【client】三个文件夹放到【/home/rabbitmq/ssl】文件夹下

1
2
3
4
执行以下3条命令
cp -r rmqca /home/rabbitmq/ssl
cp -r server /home/rabbitmq/ssl
cp -r client /home/rabbitmq/ssl

第七步,修改RabbitMQ的配置文件rabbitmq.conf。在RabbitMQ3.7.0以后,配置文件是sysctl格式。

查看具体配置文件文档请移步https://www.rabbitmq.com/configure.html

rabbitmq.conf文件位置在【/home/rabbitmq/etc/rabbitmq】下

也可以执行以下命令寻找rabbitmq.conf文件位置

1
find / -name rabbitmq.conf

rabbitmq.conf配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
loopback_users.guest = false
listeners.tcp.default = 5672
# SSL\TLS通信的端口
listeners.ssl.default = 5671
# 服务端私钥和证书文件配置
ssl_options.cacertfile = /home/rabbitmq/etc/rabbitmq/ssl/rmqca/cacert.pem
ssl_options.certfile = /home/rabbitmq/etc/rabbitmq/ssl/server/cert.pem
ssl_options.keyfile = /home/rabbitmq/etc/rabbitmq/ssl/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服务

1
2
docker start rabbitmq
docker ps -a

第九步,登录控制台 【localhost:15672】,看见如下图说明配置成功。