Поделиться через


Пример безопасности обнаружения

Спецификация обнаружения не требует защиты конечных точек, участвующих в процессе обнаружения. Усиление сообщений для обнаружения с применением мер безопасности устраняет различные типы атак (изменение сообщений, отказ в обслуживании, воспроизведение, спуфинг).

Пример DiscoveryScenario реализует пользовательские каналы, которые вычисляют и проверяют подписи сообщений с помощью формата компактной подписи (описано в разделе 8.2 спецификации WS-Discovery). Пример поддерживает спецификацию обнаружения 2005 и версию 1.1.

Настраиваемый канал накладывается на существующий стек каналов для конечных точек обнаружения и объявления. Таким образом, для каждого отправленного сообщения применяется заголовок подписи. Подпись проверяется на полученных сообщениях и когда она не соответствует или когда сообщения не имеют подписи, удаляются сообщения. Для подписывания и проверки сообщений в примере используются сертификаты.

Обсуждение

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

Элемент безопасной привязки создает безопасные фабрики каналов и прослушиватели каналов.

Фабрика безопасных каналов

Фабрика безопасных каналов создает выходные или дуплексные каналы, добавляющие компактную подпись в заголовки сообщений. Чтобы сделать сообщения как можно компактнее, используется компактный формат подписи. Структура компактной подписи показана в следующем примере.

<d:Security ... >
  [<d:Sig Scheme="xs:anyURI"
         [KeyId="xs:base64Binary"]?
          Refs="..."
         [PrefixList]="xs:NMTOKENS"
          Sig="xs:base64Binary"
          ... />]?
  ...
</d:Security>

Замечание

Он PrefixList добавлен в протокол версии Discovery 2008 года.

Для вычисления сигнатуры образец определяет элементы расширенной подписи. Создается xml-подпись (SignedInfo) с помощью ds префикса пространства имен, как это требуется в соответствии со спецификацией WS-Discovery. Текст и все заголовки в пространствах имен обнаружения и адресации ссылаются в сигнатуре, поэтому они не могут быть изменены. Каждый элемент, на который ссылается ссылка, преобразуется с помощью эксклюзивной канонизации (http://www.w3.org/2001/10/xml-exc-c14n#), а затем вычисляется значение дайджеста SHA-1 (http://www.w3.org/2000/09/xmldsig#sha1). На основе всех ссылочных элементов и их значений дайджеста значение подписи вычисляется с помощью алгоритма RSA (http://www.w3.org/2000/09/xmldsig#rsa-sha1).

Сообщения подписаны с помощью сертификата, указанного клиентом. Когда создается элемент привязки, необходимо указать местоположение магазина, название и имя субъекта сертификата. В KeyId компактной сигнатуре содержится идентификатор ключа маркера подписи, который является идентификатором ключа субъекта (SKI) маркера подписи или, если ski не существует, SHA-1 хэш открытого ключа маркера подписи.

Прослушиватель защищенных каналов

Прослушиватель защищенных каналов создает входные или дуплексные каналы, которые проверяют компактную подпись в полученных сообщениях. Чтобы проверить подпись, используется компактная подпись KeyId, присоединенная к сообщению, которая помогает выбрать сертификат из указанного хранилища. Если сообщение не имеет подписи или проверка подписи завершается ошибкой, сообщения удаляются. Чтобы использовать безопасную привязку, пример определяет фабрику, которая создает пользовательские UdpDiscoveryEndpoint и UdpAnnouncementEndpoint с добавленным элементом безопасной привязки для обнаружения. Эти безопасные конечные точки можно использовать в слушателях объявлений о обнаружении и обнаруживаемых службах.

Детали образца

Пример включает библиотеку и 4 консольных приложения:

  • DiscoverySecurityChannels: библиотека, которая предоставляет безопасную привязку. Библиотека вычисляет и проверяет компактную подпись исходящих и входящих сообщений.

  • Служба: служба, предоставляющая контракт ICalculatorService, размещенный самостоятельно. Служба отмечена как обнаруживаемая. Пользователь указывает сведения о сертификате, используемом для подписывания сообщений, указав расположение и имя магазина, имя субъекта или другой уникальный идентификатор сертификата, а также хранилище, где находятся сертификаты клиента (сертификаты, используемые для проверки подписи входящих сообщений). На основе этих сведений создается и используется UdpDiscoveryEndpoint с добавленной безопасностью.

  • Клиент: этот класс пытается определить службу ICalculatorService и вызвать методы в этой службе. Снова создаётся UdpDiscoveryEndpoint с добавленной безопасностью, который используется для подписания и проверки сообщений.

  • AnnouncementListener: самостоятельно размещённая служба, которая прослушивает объявления в онлайн и офлайн режиме и использует точку доступа для безопасных объявлений.

Замечание

Если Setup.bat выполняется несколько раз, диспетчер сертификатов предложит выбрать сертификат для добавления, так как существуют повторяющиеся сертификаты. В этом случае необходимо прервать Setup.bat и вызвать Cleanup.bat, так как дубликаты уже созданы. Cleanup.bat также предлагает выбрать сертификат для удаления. Выберите сертификат из списка и продолжайте выполнять Cleanup.bat до тех пор, пока не останутся сертификаты.

Использование этого примера

  1. Выполните скрипт Setup.bat из командной строки разработчика для Visual Studio. В примере используются сертификаты для подписывания и проверки сообщений. Скрипт создает сертификаты с помощью Makecert.exe, а затем устанавливает их с помощью Certmgr.exe. Скрипт должен выполняться с правами администратора.

  2. Чтобы создать и запустить пример, откройте файл Security.sln в Visual Studio и выберите "Перестроить все". Обновите свойства решения, чтобы запустить несколько проектов: выберите "Пуск " для всех проектов, кроме DiscoverySecureChannels. Запустите решение в обычном режиме.

  3. После завершения работы с примером выполните скрипт Cleanup.bat, который удаляет сертификаты, созданные для этого примера.