Образец безопасности при обнаружении
В спецификации Discovery не требуется защищенность конечных точек, участвующих в процессе обнаружения. Включение функций безопасности для сообщений обнаружения обеспечивает защиту от атак различного типа (изменение сообщений, отказ в обслуживании, воспроизведение, подделка пакетов).
Пример 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
добавлен в версии 2008 протокола Discovery.
Для вычисления сигнатуры в образце определяются развернутые элементы сигнатуры. Создается 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, который удаляет сертификаты, созданные для этого образца.