2010-11-10 5 views
1

J'ai l'exigence que le contenu de tous les messages doit être crypté d'une manière ou d'une autre. Pour le chiffrement réel, je peux probablement tirer parti du cryptage X.509 intégré.NServiceBus: cryptage au niveau du message

Cependant, je me demande quelle est la meilleure façon de faire un chiffrement de niveau message, sans avoir à modifier les messages eux-mêmes (donc pas WireEncryptedString). Je peux voir que la dernière version en développement offrira un peu plus de soutien pour cela sous la forme de IMutateOutgoingMessages, IMutateIncomingMessages et IMapOutgoingTransportMessages. Surtout le dernier est intéressant car il se passe un Stream que je vais pouvoir crypter dans son intégralité (pas vrai?). J'ai vu cette approche utilisée here et il mentionne correctement qu'il n'y a pas de IMapIncomingTransportMessages, alors comment pourrais-je décrypter le message crypté du côté réception sans modifier le code NServiceBus, ou est-ce actuellement la seule option jusqu'à ce que cela soit étoffé?

Cependant, c'est la future version de NServiceBus et je ne pense pas que ce soit une bonne idée de l'utiliser dans un scénario de production pour le moment. Comment ferais-je cela en 2.0? Pour moi, la meilleure façon semble être d'écrire un EncryptedSerializer personnalisé qui est passé en IMessageSerializer et fondamentalement juste enveloppe les méthodes Serialize et Deserialize de ce IMessageSerializer.

Ce que j'ai actuellement:

public class EncryptedSerializer : IMessageSerializer 
{ 
    [Inject] 
    public MessageSerializer Serializer { get; set; } 

    public IMessage[] Deserialize(System.IO.Stream stream) 
    { 
    // decrypt magic happens here 
    return Serializer.Deserialize(stream); 
    } 

    public void Serialize(IMessage[] messages, System.IO.Stream stream) 
    { 
    Serializer.Serialize(messages, stream); 
    // encrypt magic happens here 
    } 
} 

Mais je ne peux pas comprendre comment configurer la configuration NServiceBus qu'il est transmis dans un XmlSerializer qui est correctement configuré/injecté ainsi. J'ai regardé la méthode d'extension .XmlSerializer() et essayé de reproduire cela, mais sans succès. Et idéalement, je voudrais avoir juste un IMessageSerializer au lieu du sérialiseur XML concret, mais c'est moins inquiétant.

J'utilise Ninject et le générateur d'objet Ninject pour NServiceBus à partir d'ici: gist.github.com/326321. Mais je ne suis pas sûr que ce soit important.

Répondre

1

Si vous êtes prêt à abandonner l'envoi d'un autre message sérialiseur dans votre propre sérialiseur et juste envelopper le sérialiseur XML concret, ce serait plus simple. Vous devez également exposer des propriétés supplémentaires (celles du sérialiseur XML), puis les transmettre.

Je sais que ce n'est pas particulièrement élégant et c'est pourquoi nous améliorons l'histoire d'extensibilité dans la prochaine version pour vous permettre de brancher le cryptage sans tripoter le sérialiseur. Cela dit, il est probable que vous n'avez pas besoin de cryptage entre tous les points de terminaison, mais seulement entre ceux qui communiquent en dehors du réseau local. Dans ce cas, vous pouvez utiliser le processus Gateway fourni avec NServiceBus, qui active la communication HTTP, qui peut ensuite être configurée pour passer par HTTPS. Cette solution nécessiterait moins de codage mais impliquerait un autre processus dans votre déploiement.