WCF NetTcpBinding Security - как это работает? - PullRequest
26 голосов
/ 29 марта 2010

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

Я создал службу клиент-сервер WCF, используя привязку NetTcp. Я не вносил никаких изменений в настройки безопасности, и при работе на одной машине он работает очень хорошо. Однако, когда я запустил мой клиент с другого компьютера, он пожаловался, что серверу не понравились отправленные учетные данные безопасности.

Я понимаю сейчас , что NetTCP по умолчанию "защищен" и что мой клиент передавал неверные данные безопасности - а именно имя пользователя и пароль Windows (или некоторую форму проверки подлинности домена) моему сервер, который, поскольку они не работают в одном домене, не понравился бы.

Однако я не понимаю следующее:

Я не указал никакой защиты в привязке - стандартные настройки ожидают отправки имени пользователя или пароля Windows?

У меня не установлен сертификат на моем сервере - я понимаю, что для привязки NetTCP необходим какой-либо открытый закрытый ключ для защиты учетных данных, - но все же это работало, когда и клиент, и сервер находились на одной машине - как это было данные становятся зашифрованными? Или хочет, чтобы WCF знал, что он находится на той же машине и шифрование не требуется?

Я должен был установить мой режим безопасности на моем клиенте и сервере как «нет», и они хорошо подключились. Но есть ли способ зашифровать мои данные без сертификата?

Наконец ... в чем разница между безопасностью транспорта и сообщений?

Чтобы проверить мое понимание (простите за сценарий!) Безопасности сообщений, я отправил письмо от лица А к человеку В и закодировал письмо, чтобы убедиться, что, если кто-то его перехватит, они не смогут его прочитать? Безопасность на транспорте - если я решу отправить мое письмо на вооруженном транспорте, чтобы никто не смог получить его по пути?

Возможно ли иметь какую-либо форму шифрования в WCF без сертификата? Мой проект - частный проект, и я не хочу покупать сертификат, и данные в любом случае не настолько чувствительны, так что это только для моих собственных знаний.

1 Ответ

32 голосов
/ 31 июля 2010

Тип учетных данных клиента по умолчанию для NetTcpBinding - Аутентификация Windows. Чтобы аутентификация Windows работала, клиент и сервер должны находиться в одном домене или во взаимно доверяющих доменах (которых в вашем случае у вас нет).

Если бы клиент и сервер находились в одном домене, WCF обрабатывал бы механизм аутентификации Windows «за кулисами». И когда клиент и сервер находятся на одном компьютере, они фактически находятся в одном домене, поэтому Windows может использовать свои собственные механизмы для управления шифрованием и дешифрованием. Это будет сделано только во взаимно доверяющих доменах.

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

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

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

Подводя итог: чтобы использовать шифрование через NetTcpBinding, клиент и сервер должны находиться в домене (или взаимно доверяющих доменах) или у вас должен быть сертификат обмена ключами.


Редактировать: меня попросили привести пример кода - здесь есть обязательный элемент в XAML. Обычно он помещается в элемент netTcpBinding.

<binding name="Secure" listenBacklog="4000" receiveTimeout="00:20:00" sendTimeout="00:20:01" 
   maxReceivedMessageSize="2147483647" maxConnections="200" portSharingEnabled="true">
   <!-- ~2 GB -->
   <readerQuotas maxStringContentLength="2147483647"/>
   <!-- ~2 GB max string content length -->
   <security mode="Message">
      <transport clientCredentialType="None" protectionLevel="EncryptAndSign"/>
      <message clientCredentialType="None"/>
   </security>
</binding>

Важной частью является элемент безопасности. Для безопасности транспорта можно изменить атрибут режима на «Транспорт». Скорее всего, clientCredentialType будет не «None», а «Certificate», «Ntlm» или «Windows» в зависимости от контекста.

...