Как обезопасить службу фасада WCF с 3 прыжками, используя сертификаты? - PullRequest
2 голосов
/ 18 декабря 2009

Я недавно разработал услугу Фасад WCF. Я новичок в WCF и у меня проблемы с пониманием элементов реализации безопасности.

Услуга выглядит следующим образом:

  • На общедоступном веб-сайте asp.net есть клиент WCF, который обращается к:
  • Услуга Фасад WCF в демилитаризованной зоне, которая, в свою очередь, действует как клиент для доступа:
  • Служба внутренней сети WCF

Все службы в настоящее время используют WSHttpBinding.

Я хотел бы использовать сертификаты X.509 для аутентификации клиент / сервер между всеми 3 серверами (т.е. общедоступное клиентское приложение и служба фасадов аутентифицируют друг друга с использованием сертификатов, клиент фасада и внутренний сервис аутентифицируют друг друга с использованием сертификатов).

Может ли кто-нибудь объяснить шаг за шагом, что нужно сделать, чтобы обезопасить себя в производственной среде? В каждой статье и книге, на которые я ссылался, объясняется использование makecert.exe, но не объясняется использование производственных сертификатов из реального ЦС. Я знаю, что это, вероятно, легко, но я не могу обернуть голову вокруг требуемых концепций.

Из доверенного центра сертификации у меня есть сертификат SSL для доступа пользователей к общедоступному веб-сайту и сертификат SSL SAN, который можно применить к 4 доменным именам через альтернативные имена субъектов. Я все еще не уверен в том, что мне нужно использовать makecert.exe и т. Д. Для создания клиентских сертификатов и т. Д.

В идеале все настройки службы / клиента должны быть в app / web.config (без кода). У меня есть полный административный доступ ко всем трем серверам (общедоступный веб-сервер, сервер фасадов / dmz, внутренний веб-сервер).

Буду очень признателен за любые идеи или рекомендации!

Изменения для предоставления более подробной информации на основе комментариев:

  • IIS 6 для всех серверов
  • аутентификация пользователя не требуется на общедоступном сайте. По сути, публичные посетители вводят информацию в формах, которые обрабатываются и обрабатываются службами. Аутентификация не требуется.
  • Платный сертификат EV SSL будет использоваться для обеспечения безопасности взаимодействия между публичным посетителем и веб-сайтом.

Меня интересует, как реализовать взаимную аутентификацию / идентификацию сертификата между различными клиентами / сервисами WCF. Итак:

  • Клиент WCF на общедоступном сервере и служба WCF на сервере Facade / DMZ взаимно идентифицируются и аутентифицируются друг с другом с использованием сертификатов
  • Клиент WCF на сервере Facade / DMZ и служба WCF на внутреннем сервере затем также взаимно идентифицируют и аутентифицируют друг друга с использованием сертификатов.

У меня есть гибкий сертификат SAN от доверенного CA (DigiCert), который я хотел бы использовать, если это возможно, для аутентификации. Он может поддерживать до 4 записей DNS через альтернативные имена субъектов.

Спасибо за любую помощь, которая может быть оказана!

1 Ответ

1 голос
/ 22 декабря 2009

Ну, после долгих исследований, проб и ошибок, я думаю, что я обдумал эту проблему и нашел решение.

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

С этого момента в конфигурации я решил использовать сочетание безопасности транспорта и сообщений (TransportWithMessageCredential) для обеспечения шифрования HTTPS и сообщений на уровне сертификатов.

Конфигурация результирующего поведения службы:

<serviceBehaviors>
  <behavior name="MyCustomBehavior">
    ...
    <serviceCredentials>
    <serviceCertificate findValue="MySANCertName"
                        x509FindType="FindBySubjectName"
                        storeLocation="LocalMachine"
                        storeName="My" />            
    </serviceCredentials>
    ...
  </behavior>
</serviceBehaviors>

и переплет:

<wsHttpBinding>
  <binding name="MyWsBinding">
    <security mode="TransportWithMessageCredential">
      <message clientCredentialType="Certificate"/>
    </security>
  </binding>
</wsHttpBinding>

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

<serviceBehaviors>
  <serviceSecurityAudit 
    auditLogLocation="Application"
    messageAuthenticationAuditLevel="SuccessOrFailure"
    serviceAuthorizationAuditLevel="SuccessOrFailure" 
    suppressAuditFailure="false" />
  </behavior>
</serviceBehaviors>

Следующие ссылки были наиболее полезны при реализации моего решения:

http://notgartner.wordpress.com/2007/09/06/using-certificate-based-authentication-and-protection-with-windows-communication-foundation-wcf/ http://www.codeproject.com/KB/WCF/wcf_certificates.aspx?display=Print Основа Windows Communication Foundation для .NET Framework 3.5

...