Подписание сообщения 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.