Ответ 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" в зависимости от контекста.