WCF, Безопасность и Сертификаты - PullRequest
6 голосов
/ 24 апреля 2009

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

Размышляя о безопасности WCF, я возвращаюсь к мысли, что нам следует использовать сертификаты x509. Тем не менее, наши клиенты определенно не захотят знать о каких-либо деталях необходимости подать заявку, приобрести и установить эти сертификаты.

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

Действительно, я ищу лучшую практику, с наименьшим трением для наших клиентов.

Спасибо!

Редактировать: Я использую NetTcpBinding, и мой сервер работает как служба Windows.

Ответы [ 3 ]

5 голосов
/ 24 апреля 2009

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

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

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

2 голосов
/ 20 мая 2009

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

По аналогии с вашими сценариями в интрасети (я предполагаю), я имел полномочия на сервер и клиентские машины во время установки ... или, по крайней мере, мог диктовать некоторые условия установки.

Вместо того, чтобы покупать сертификаты x509 и обременять клиента этими расходами, я решил взять свой собственный. Мы настроили один из наших серверов Win2003 в качестве CA, выпустив собственный сертификат Certification Authority. Затем мы создали сертификат x509 для сервера, а также отдельные сертификаты x509 для клиентов.

Сертификаты клиента и сервера были установлены как на клиенте, так и на сервере (при необходимости) в хранилище персональных пользователей на уровне компьютера. Мы также установили наш сертификат CA непосредственно в раздел Trusted Root Certification Authorities, что сделало наши сертификаты клиента и сервера доверенными.

Поскольку я меньше интересовался аутентификацией / авторизацией, я не знаю, что рекомендовать в качестве наилучшей практики при работе с привязкой сертификатов к отдельным пользователям и переходе на более детальный, чем на уровне компьютера (моим решением была служба Windows для службы Windows общение - полностью без присмотра). Я думаю, вам понадобится сертификат для каждого пользователя, который будет установлен в их личном хранилище в MMC сертификатов. Реализация во время выполнения будет зависеть от того, как вы настроите WCF для поиска сертификата, поэтому это должно быть довольно просто.

На протяжении всего процесса я сильно полагался на то, что узнал из этой замечательной статьи CodeProject: Защита служб WCF с помощью сертификатов . Он проведет вас через создание / установку сертификатов. Пример приложения WCF размещается на IIS, но мне удалось довольно легко перевести разделы конфигурации из web.config в app.config.

В моем случае я предоставил веб-интерфейс для запроса сертификатов в Win2003 самой сети, чтобы клиент мог запрашивать сертификаты непосредственно в будущем. У нас есть контроль одобрения, поэтому он работает хорошо. У меня еще не было необходимости создавать новые сертификаты, поэтому я не могу сказать, сколько трения это повлечет за собой.

1 голос
/ 24 апреля 2009

Если вы собираетесь пересекать границы брандмауэра, то сертификаты станут вашим лучшим решением. Я не очень разбираюсь в особенностях приложений для сертификатов или вашего приложения. К сожалению, насколько я знаю, я думаю, что вам придется помочь им подать заявку на сертификаты, или они должны будут сделать это самостоятельно, если они не захотят предпринять в процессе установки своего собственного сервера сертификатов. Если приложение будет внутренним, то проверка подлинности Windows будет работать и ОЧЕНЬ легко, но если вы думаете, что у вас будут клиенты, которые используют ваше приложение через границы брандмауэра, то вы могли бы также потратить время на использование сертификатов, потому что сертификаты будут работать везде. Теперь существует нечто, называемое федеративной безопасностью, где вы делегируете разрешение аутентификации другому объекту. Я думаю, что это используется, если, скажем, у вас есть домены, и вы хотите делегировать разрешение, скажем, кому-то в другом домене, который не принадлежит вашему домену, их домену, но он довольно сложный и мое понимание его очень ограничено, но под влиянием ваших требований сертификаты это путь.

Безопасность не должна быть простой:)

...