Подписание сообщения RabbitMQ

Я хочу использовать RabbitMQ для связи между несколькими приложениями, которые развернуты в разных сетях и обслуживаются разными людьми. Как получатель сообщения (потребитель) я хочу убедиться, что отправитель сообщения (производитель) - это тот, кем он себя считает. Лучшим подходом, который я могу придумать, было бы подписание сообщения и проверка этих подписей. Поскольку я впервые делаю что-то с RabbitMQ, я застрял на том, как это реализовать.

Отправители и получатели сообщений являются Java-приложениями. Я решил использовать шаблон Spring AMQP, чтобы мне было проще. В идеальном сценарии я хотел бы каким-то образом перехватить сообщение, когда оно уже является байтовым массивом / потоком, подписать этот большой двоичный объект и прикрепить подпись в качестве заголовка сообщения. На приемном конце я снова хотел бы перехватить сообщение перед его десериализацией, проверить подпись из заголовка против большого двоичного объекта и, если все в порядке, затем десериализовать его. Но я не нашел никаких средств в Spring-Rabbit для этого. Есть понятие MessagePostProcessor в Spring-Rabbit, но когда это вызывается, сообщение все еще не полностью сериализовано. Кажется, что-то, что я себе представлял, может быть где-то решено кем-то, что кажется общей проблемой, но мои исследования оставили меня с пустыми руками.

В настоящее время я использую AmqpTemplate.convertAndSend для отправки сообщений и @RabbitListener для получения сообщения. Но я не застрял с весны. Я могу использовать все, что мне нравится. Это просто казалось легким способом начать работу. Я использую Джексона для сериализации сообщений в / из JSON. Проблема в том, как перехватить отправку и получение в нужном месте.

План резервного копирования состоит в том, чтобы поместить в тело и данные, и подпись, и объединить их с оболочкой, но это будет означать двойную сериализацию и не будет таким чистым, как хотелось бы, чтобы решение было.

Итак, есть ли у кого-то опыт работы с этими вещами, и, возможно, может посоветовать мне, как подойти к этой проблеме?

1 ответ

Решение

Есть понятие MessagePostProcessor в Spring-Rabbit, но когда это вызывается, сообщение все еще не полностью сериализовано.

Я не уверен, что вы подразумеваете под этим; MessagePostProcessor это именно то, что вам нужно body это byte[] это будет отправлено в RabbitMQ. Вы можете использовать перегруженный convertAndSend метод, который принимает MPP, или добавьте свой MPP в шаблон (в beforeSendMessagePostProcessors).

На принимающей стороне фабрика контейнера слушателя может быть настроена с afterReceiveMessagePostProcessors, Снова; body это byte[] получено от RabbitMQ.

Другие вопросы по тегам