我要求必须以某种方式加密所有邮件的内容。对于实际加密,我可以利用内置的X.509加密。
但是,我想知道消息级加密的最佳方法是什么,而不必自己修改消息(所以没有WireEncryptedString
)。我可以看到,正在开发的最新版本将以IMutateOutgoingMessages
,IMutateIncomingMessages
和IMapOutgoingTransportMessages
的形式为此提供更多支持。特别是最后一个是有趣的,因为它传递了Stream
,我将能够完整加密(对吗?)。我已经看到这种方法使用here并且他正确地提到没有IMapIncomingTransportMessages
,那么我如何在不修改NServiceBus代码的情况下解密接收端的加密消息,或者当前是唯一的选择,直到它充实?
然而,这是NServiceBus的未来版本,我不认为现在在生产场景中使用它是个好主意。我怎么会在2.0中这样做呢?对我来说,最好的方法似乎是编写一个EncryptedSerializer
传递给IMessageSerializer
的{{1}},基本上只包含Serialize
和Deserialize
方法IMessageSerializer
}。
我现在有什么:
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
}
}
但我无法弄清楚如何设置它在正确配置/注入的XmlSerializer中传递的NServiceBus配置。我查看了.XmlSerializer()
扩展方法并试图复制它,但没有运气。理想情况下,我希望只有一个IMessageSerializer
而不是具体的XML序列化程序,但这个问题不太重要。
我从这里使用Ninject和NServiceBus的Ninject对象构建器:gist.github.com/326321。但我不确定这是否重要。
答案 0 :(得分:1)
如果您愿意放弃将另一个消息序列化程序注入到您自己的序列化程序中并且只包装具体的XML序列化程序,那么它会更容易。您还需要公开其他属性(XML序列化程序中的属性),然后通过它们。
我知道这不是特别优雅,这就是为什么我们要改进下一版本中的可扩展性故事,以允许您插入加密而无需摆弄序列化器。
尽管如此,您可能不需要在所有端点之间进行加密,而只需要在LAN外部进行通信。对于这些情况,您可以使用NServiceBus附带的网关进程,该进程启用基于HTTP的通信,然后可以将其配置为通过HTTPS进行通信。此解决方案需要较少的编码,但会涉及部署中的其他流程。