Безопасность сообщений WCF без сертификата и windows auth

У меня есть служба WCF и клиент, который будет развернут в нескольких компаниях (сотни). Некоторые компании будут запускать программное обеспечение в своей сети, а некоторые будут запускать его через Интернет (сервер WCF на офисе, клиент WCF – на другой).

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

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

Короче говоря, нам нужно простое решение, в котором шифрование основано только на общем секретном, в нашем случае имя пользователя / пароль, с которым пользователь входит в систему. Я понимаю, что это не даст наилучшего доступного шифрования, но мы готовы обменять часть безопасности, чтобы упростить развертывание программного обеспечения.

Это возможно?

* С «реальными» сертификатами я имею в виду сертификаты, приобретенные у центра сертификации, а не тот, который я создал сам / самостоятельно.

Если вы хотите зашифровать сообщения на транспорте (это действительно хорошая идея!), Должны существовать некоторые общие знания между отправителем (клиентом) и сервером. Это может быть жестко запрограммировано, но это действительно не очень хорошая идея – если это «общее общее» знание когда-либо скомпрометировано, злоумышленник может расшифровать и прочитать все ваши сообщения.

Кроме того, поскольку это определенно не рекомендуется, нет никакой поддержки в WCF для упрощения использования общего секрета. Вы сами по себе – вам нужно катиться на 100%.

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

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

Марк

PS: Если вы действительно хотите исследовать подход «жестко закодированный общий секрет», вам нужно подумать об этом:

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

Как правило, подход будет двояким:

  1. обмен какой-либо формой пары частных / открытых ключей; сервер генерирует пару ключей и сохраняет закрытый ключ для себя и разделяет открытый ключ с клиентом (например, через сообщение WCF, например)
  2. используя эту частную / открытую пару ключей, обменивайтесь общим общим секретом, например «ключ шифрования», который будет симметрично шифровать ваши сообщения (и поскольку он симметричен, сервер может использовать один и тот же ключ для дешифрования сообщений)
  3. настроить инфраструктуру на вашем клиенте (например, расширение WCF, называемое поведением ), чтобы проверить сообщение до его выхода и зашифровать его с помощью вашего общего секрета

В целом, это действительно не тривиально – ничего проще, чем это вообще не стоит называть «безопасностью».

Если вы посмотрите на всю эту работу, вам придется делать – не будет ли проще использовать встроенные механизмы сертификации WCF?

Достойная безопасность, стоящая на ее соли, – это трудно, поэтому почему бы не использовать то, что доступно, вместо того, чтобы делать всю работу самостоятельно или, что еще хуже: придумать полубеленое решение, которое так легко взломать, можно так же легко отправить все в cleartext … .. не оценивайте сложность и количество кода, необходимого для обработки даже самых основных сценариев безопасности – WCF делает все это для вас – бесплатно и надежным и безопасным способом – используйте его! Вы не пожалеете!

Ну, с WCF вы можете использовать учетные данные паролей на уровне сообщений и SSL на уровне транспорта, чего, как мне кажется, будет достаточно в вашем случае.

См. Здесь .

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

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

Взгляните на следующий пример:

http://www.codeproject.com/KB/WCF/wcfcertificates.aspx

Он использует сертификаты, но без хранилища сертификатов, поэтому настройка не требуется.

Хм .. может быть, что-то простое можно было бы использовать. Переместите шифрование с программного обеспечения на оборудование. VPN от каждой клиентской сети до вашей собственной, а затем вы можете делать все, что хотите для транспорта WCF. Строка не является четким текстом, и проблема решена.

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

Я надеюсь, что это помогает!

  • Хеширование, соль и хранение хешированных значений
  • Самый простой способ шифрования текстового файла в java
  • Почему безопасность через неясность - плохая идея?
  • Как защитить общие настройки Android?
  • Обработка криптовых исключений
  • Давайте будем гением компьютера.