Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Спецификация обнаружения не требует защиты конечных точек, участвующих в процессе обнаружения. Усиление сообщений для обнаружения с применением мер безопасности устраняет различные типы атак (изменение сообщений, отказ в обслуживании, воспроизведение, спуфинг).
Пример 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 до тех пор, пока не останутся сертификаты.
Использование этого примера
Выполните скрипт Setup.bat из командной строки разработчика для Visual Studio. В примере используются сертификаты для подписывания и проверки сообщений. Скрипт создает сертификаты с помощью Makecert.exe, а затем устанавливает их с помощью Certmgr.exe. Скрипт должен выполняться с правами администратора.
Чтобы создать и запустить пример, откройте файл Security.sln в Visual Studio и выберите "Перестроить все". Обновите свойства решения, чтобы запустить несколько проектов: выберите "Пуск " для всех проектов, кроме DiscoverySecureChannels. Запустите решение в обычном режиме.
После завершения работы с примером выполните скрипт Cleanup.bat, который удаляет сертификаты, созданные для этого примера.