6 votes

Signature de message RabbitMQ

Je veux utiliser RabbitMQ pour communiquer entre plusieurs applications qui sont déployées sur différents réseaux et sont gérées par différentes personnes. En tant que destinataire d'un message (consommateur), je veux être convaincu que l'expéditeur du message (producteur) est bien celui qu'il prétend être. La meilleure approche à laquelle je peux penser serait la signature des messages et la vérification de ces signatures. Comme c'est la première fois que je travaille avec RabbitMQ, je suis un peu bloqué sur la façon de mettre en œuvre cela.

Les expéditeurs et les destinataires de messages sont des applications Java. J'ai décidé d'utiliser le modèle Spring AMQP pour faciliter un peu les choses pour moi. Dans un scénario parfait, j'aimerais en quelque sorte intercepter le message lorsqu'il est déjà un tableau d'octets/flot, signer ce blob et attacher la signature en tant qu'en-tête du message. En réception, j'aimerais à nouveau intercepter le message avant sa désérialisation, vérifier la signature de l'en-tête par rapport au blob et, si tout est OK, le désérialiser. Mais je n'ai trouvé aucun moyen dans Spring-Rabbit pour faire cela. Il existe un concept de MessagePostProcessor dans Spring-Rabbit, mais lorsqu'il est invoqué, le message n'est toujours pas entièrement sérialisé. Il semble que quelque chose que j'avais imaginé serait résolu quelque part par quelqu'un car cela semble être un problème courant, mais mes recherches sont restées infructueuses.

Actuellement, j'utilise AmqpTemplate.convertAndSend pour l'envoi de messages et @RabbitListener pour la réception de messages. Mais je ne suis pas limité à Spring. Je peux utiliser ce que je veux. Cela semblait juste être un moyen facile de démarrer. J'utilise Jackson pour la sérialisation des messages vers/depuis JSON. Le problème est comment intercepter l'envoi et la réception au bon endroit.

Le plan de secours consiste à mettre à la fois les données et la signature dans le corps et à les joindre avec un enrobage, mais cela signifierait une double sérialisation et n'est pas aussi propre que je voudrais que la solution soit.

Alors est-ce que quelqu'un a de l'expérience avec ce genre de chose et pourrait peut-être me conseiller sur la façon d'aborder ce problème ?

1voto

Gary Russell Points 73920

Il existe un concept de MessagePostProcessor dans Spring-Rabbit, mais lorsque cela est invoqué, le message n'est toujours pas entièrement sérialisé.

Je ne suis pas sûr de ce que vous voulez dire par là; le MessagePostProcessor est exactement ce dont vous avez besoin, le body est le byte[] qui sera envoyé à RabbitMQ. Vous pouvez utiliser une méthode surchargée convertAndSend qui prend un MPP, ou ajouter votre MPP au template (dans les beforeSendMessagePostProcessors).

Côté réception, l'usine de conteneurs d'écouteurs peut être configurée avec des afterReceiveMessagePostProcessors. Encore une fois; le body est le byte[] reçu de RabbitMQ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X