WCF NetTcpBinding Security-как это работает?

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

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

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

однако, чего я не понимаю, так это следующее:

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

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

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

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

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

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

1 ответов


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

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

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

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

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

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


Edit: меня попросили привести пример кода-вот элемент привязки в 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>

важной частью является элемент безопасности. Для обеспечения безопасности транспорта можно изменить атрибут mode на "Transport". Скорее всего, clientCredentialType будет не "нет", а скорее" сертификат"," Ntlm "или" Windows " в зависимости от контекста.