2010-11-10 2 views
1

У меня есть требование, чтобы содержимое всех сообщений было каким-то образом зашифровано. Для фактического шифрования я, вероятно, могу использовать встроенное шифрование X.509.NServiceBus: шифрование уровня сообщений

Тем не менее, мне интересно, как лучше всего использовать шифрование на уровне сообщений, без необходимости изменять сами сообщения (так что нет WireEncryptedString). Я вижу, что последняя версия в разработке предложит дополнительную поддержку для этого в виде IMutateOutgoingMessages, IMutateIncomingMessages и IMapOutgoingTransportMessages. Особенно интересен последний, поскольку ему передается Stream, что я смогу зашифровать полностью (правда?). Я видел, что этот подход используется here, и он правильно упоминает, что нет IMapIncomingTransportMessages, так как я могу сделать дешифрование зашифрованного сообщения на принимающей стороне без изменения кода NServiceBus, или это в настоящее время единственный вариант, пока это не будет устранено?

Однако, это будущая версия NServiceBus, и я не думаю, что это хорошая идея использовать ее в сценарии производства прямо сейчас. Как мне это сделать в 2.0? Для меня лучший способ - написать обычай EncryptedSerializer, который передается в IMessageSerializer и в основном просто обертывает 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 
    } 
} 

Но я не могу понять, как настроить конфигурацию NServiceBus, что она будет послана в XmlSerializer, который правильно сконфигурирован/впрыскивается, а также. Я посмотрел на метод расширения .XmlSerializer() и попытался воспроизвести его, но не повезло. И в идеале, я бы хотел иметь только IMessageSerializer вместо конкретного XML-сериализатора, но это имеет меньшее значение.

Я использую Ninject и конструктор объектов Ninject для NServiceBus отсюда: gist.github.com/326321. Но я не уверен, что это важно.

ответ

1

Если вы готовы отказаться от добавления другого сериализатора сообщений в свой собственный сериализатор и просто обернуть конкретный XML-сериализатор, было бы проще. Вам также нужно будет выставить дополнительные свойства (те, что есть в сериализаторе XML), а затем передать их.

Я знаю, что это не особенно элегантно, и поэтому мы улучшаем историю расширения в следующей версии, чтобы вы могли подключать шифрование без использования сериализатора.

Все, что сказано, скорее всего, вам не требуется шифрование между всеми конечными точками, а скорее только между теми, кто общается вне локальной сети. В этих случаях вы можете использовать процесс Gateway, который поставляется с NServiceBus, который позволяет использовать HTTP-связь, которая затем может быть настроена для перехода через HTTPS. Это решение потребует меньше кодирования, но будет связано с другим процессом в вашем развертывании.

Смежные вопросы