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 ?