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.pemssl_options.certfile   = /path/to/server_certificate.pemssl_options.keyfile    = /path/to/server_key.pemssl_options.verify     = verify_peerssl_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).

You should also read:

NGINX + RabbitMQ + Websocket

Fazendo proxy reverso websocket com nginx, sem TLS server { listen 3000; server_name ws.ubivis.io; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host;…