Подтвердить что ты не робот

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

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

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

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

Однако я не понимаю, что:

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

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

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

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

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

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

4b9b3361

Ответ 1

Тип учетных данных клиента по умолчанию для 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>

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