首先,这篇文章讲的是基于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】,看见如下图说明配置成功。