TLS com o RabbitMQ
Troubleshooting
sudo sh -c 'echo "loopback_users.guest = falselisteners.tcp.default = 5672" > /home/tiago/docker-volumes/rabbitmq/rabbitmq.conf'
docker run -d --hostname rabbitmq --log-driver=journald --name rabbitmq --restart unless-stopped --network host -v /home/tiago/docker-volumes/rabbitmq/:/etc/rabbitmq/ rabbitmq:3-management
sudo journalctl -f CONTAINER_NAME=rabbitmq
docker exec -it rabbitmq bashrabbitmq-plugins enable rabbitmq_management rabbitmq_web_mqtt rabbitmq_web_stomp rabbitmq_shovel rabbitmq_shovel_management
Onde guardar os arquivos?
Uma boa ideia é guardar os arquivos dentro da pasta /etc/rabbitmq/. Costumo criar uma pasta /certs e colocar os certificados lá.
A permissão dos certificados deve ser 750. Geralmente os arquivos fazem parte do grupo rabbitmq, um grupo criado automaticamente pelo rabbitmq ao ser instalado pelo repositório.
Para que as mensagens sejam criptografadas e que haja certeza de que o servidor e o cliente são realmente quem se espera, é preciso ter 2 certificados. Um para o servidor e um para o cliente.
Tanto para o cliente como para o servidor você precisa ter em mãos os seguintes arquivos:
Certificado da Autoridade Certificadora (arquivo .pem)
Certificado do seu servidor (arquivo .pem)
Chave do seu servidor (arquivo .pem)
Além disso, você precisa que o servidor confie na autoridade certificadora que gerou o certificado do cliente e precisa que o cliente confie na autoridade certificadora que gerou o certificado do servidor.
Se você está usando Linux Ubuntu, em ambos os casos, você precisa ter o pacote ca-certificates instalado na máquina. Ele já vem por padrão instalado no Ubuntu, mas se você estiver usando um contêiner Docker provavelmente ele não virá junto.
apt install -y ca-certificates
Então copie o certificado no formato .crt para a pasta /usr/local/share/ca-certificates e force o linux a reconhecer o novo certificado.
mv my_ca.crt /usr/local/share/ca-certificates/my_ca.crt &&update-ca-certificates
Depois do comando deverá aparecer:
Updating certificates in /etc/ssl/certs...1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done.
Edite o arquivo de configuração do RabbitMQ
listeners.ssl.default = 5671ssl_options.cacertfile = /path/to/ca_certificate_bundle.pem ssl_options.certfile = /path/to/server_certificate.pem ssl_options.keyfile = /path/to/server_key.pem ssl_options.verify = verify_peer ssl_options.fail_if_no_peer_cert = false
Quando for se conectar ao servidor usando TLS, a URL precisa ter o seguinte formato
amqps://myhost?cacertfile=/certs/cacert.pem&certfile=/certs/cert.pem &keyfile=/certs/key.pem &verify=verify_peer &server_name_indication=myhost
Configurações no lado do Client AMQP
ssl_options.verify
When the ssl_options.verify option is set to verify_peer, the client does send us a certificate, the node must perform peer verification. When set to verify_none, peer verification will be disabled and certificate exchange won't be performed.
ssl_options.fail_if_no_peer_cert
true or false. Setting the ssl_options.fail_if_no_peer_cert option to false tells the node to accept clients which don't present a certificate (for example, were not configured to use one).