Как настроить клиентские и серверные сертификаты для безопасности транспорта WCF? - PullRequest
3 голосов
/ 27 декабря 2011

Мой сценарий: у меня есть общедоступное веб-приложение, размещенное на серверах Amazon EC2.У меня есть собственный сервер базы данных за брандмауэром.У меня есть серверы веб-службы с собственным размещением и веб-службой для доступа к данным.Я хочу разрешить только приложениям, которые я одобряю (я живу в облаке), доступ к сервисам, и я не хочу, чтобы какие-либо данные передавались в виде открытого текста.

Из того, что я могу сказать, читая все несвязанные ибезумно запутанные статьи MSDN, темы Stackoverflow, статьи Code Project и другие блоги.Тип безопасности, который мне нужен: Транспорт Режим безопасности с Сертификатом clientCredentialType, с использованием wsHttpBinding .Первый вопрос, прав ли я, предполагая это?Это даст мне достаточно безопасности?Это не B2B или что-то подобное.Это, однако, междоменное, и я просто хочу убедиться, что могу доверять звонящему.Мой сервис работает в AppPool, принадлежащем определенному пользователю, поэтому я могу получить доступ к БД с интегрированной защитой.Мне нужно убедиться, что входящие в мой сервис только те абоненты, которых я одобряю, получают доступ. Мне не нужно шифровать сообщение больше, чем SSL, я уже не верю.

Все возможные сценарии делают его очень оченьТрудно понять, если это то, что я хочу.Но при условии, что это следующий вопрос, как мне настроить сертификаты?В настоящее время у меня есть сертификат на сервере, и я могу получить доступ только с Https.(режим безопасности = "Транспорт", clientCredentialType = "Нет").Но я не могу понять, что мне нужно сделать, чтобы изменить clientCredentialType на Certificate и заставить его работать.

  • Что я отдаю клиенту с сервера и где он это делаетgo?
  • Что я могу дать серверу от клиента и куда он идет?
  • Если у меня несколько клиентов (веб-ферма), должен ли я иметь другой сертификат клиента для всехиз них, или они могут разделить один сертификат, который принимает мой сервер?

Все статьи по разработке, которые я прочитал, говорят, что установка Cert является инструментом администратора и выходит за рамки этой статьи.Ну, материал WCF прост, это чертовски сертифицированный материал, с которым мне нужна помощь, и я еще не нашел полезных статей.Те, кто приближается, показывают, как сделать это с makecert.exe и говорят, что в производстве все будет по-другому, но затем не говорят, как это сделать в работе.

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

Любая и вся помощь оценена, Кен

1 Ответ

2 голосов
/ 24 июля 2014

Короткий ответ

Тип безопасности, который мне нужен: Режим безопасности транспорта с Сертификат clientCredentialType, используя wsHttpBinding. Первый вопрос, я прав, предполагая это?

Да. Защита сообщений также будет работать при условии, что вы не используете функции потоковой передачи WCF, но с безопасностью транспорта вы можете воспользоваться аппаратным ускорением.

как мне настроить Certs?

См. Подробный ответ ниже.

Что мне дать клиенту с сервера и куда он девается? Если у меня есть несколько клиентов (веб-ферма), нужно ли мне сертификат клиента для всех из них, или они могут поделиться одним сертификатом, что мой сервер принимает?

Вам необходимо 3 сертификата:

  • сертификат клиента (одинаковый для всех клиентов).
  • сертификат сервера.
  • сертификат центра сертификации (CA), с помощью которого клиентские и серверные сертификаты были выпущены.

Клиенту необходимо:

  • Клиентский сертификат установлен в хранилище личных сертификатов.
  • Сертификат CA установлен в хранилище доверенных корневых центров сертификации.

Что мне дать серверу от клиента и куда он идет?

Серверу нужно:

  • Сертификат сервера установлен в хранилище личных сертификатов.
  • Сертификат CA установлен в хранилище доверенных корневых центров сертификации.
  • Сертификат клиента, установленный в хранилище доверенных лиц.

Подробный ответ

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

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

I. Создать сертификаты

Как объяснено в этой статье MSDN , используйте makecert для генерации 3 сертификатов:

  1. Сертификат корневого центра сертификации, назовем его MyRootCA и его список отзыва.
  2. SSL-сертификат сервера. Имя должно быть доменным именем, которое клиенты веб-фермы будут использовать для вызова веб-служб. Например, если ваши клиенты используют следующий URL: https://mywebserver.myprivatedomain.com/service1.svc, тогда ваш сертификат CN (Common Name) будет mywebserver.myprivatedomain.com.
  3. Сертификат клиента X.509, назовем его MyAmazonClient.

Вот простая партия, которая выполняет эти 3 шага:

REM 1: MyRootCA
makecert -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.cer"
makecert -crl -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.crl"

REM 2: mywebserver.myprivatedomain.com
makecert -sk "mywebserver.myprivatedomain.com" -iv "MyRootCA.pvk" -n "CN=mywebserver.myprivatedomain.com" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky exchange -pe

REM 3: MyAmazonClient
makecert -sk "MyAmazonClient" -iv "MyRootCA.pvk" -n "CN=MyAmazonClient" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky signature -pe

Этот пакет создаст 3 файла в текущей папке:

  • MyRootCA.cer : содержит открытый ключ корневого сертификата CA.
  • MyRootCA.crl : содержит список отзыва сертификатов.
  • MyRootCA.pvk : содержит закрытый ключ корневого сертификата CA.

Два других сертификата (клиент и сервер) установлены в хранилище сертификатов локального компьютера.

Используя оснастку MMC Certificates , экспортируйте их в файлы .pfx:

  • Найдите LocalMachine> My> Сертификаты.
  • Щелкните правой кнопкой мыши MyAmazonClient > Все задачи> Экспорт.
  • Щелкните правой кнопкой мыши mywebserver.myprivatedomain.com > Все задачи> Экспорт.

II. Установить серверные сертификаты

На вашем сервере (тот, который предоставляет веб-сервисы), скопируйте следующие файлы:

  • MyRootCA.cer
  • MyRootCA.crl
  • MyAmazonClient.pfx
  • mywebserver.myprivatedomain.com.pfx

Используя оснастку MMC «Сертификаты» на сервере, установите сертификаты в следующих местах:

  • MyRootCA.cer и MyRootCA.crl в Local Computer > Trusted Root Certification Authorities > Certificates
  • MyAmazonClient.pfx в Local Computer > Trusted People > Certificates
  • mywebserver.myprivatedomain.com.pfx в Local Computer > Personal > Certificates

Предоставьте вашему IIS AppPool доступ к закрытому ключу сертификата mywebserver.myprivatedomain.com. В оснастке «Сертификаты MMC» щелкните правой кнопкой мыши mywebserver.myprivatedomain.com> Все задачи> Управление личными ключами ... Затем добавьте удостоверение, с которым работает AppPool. Обратите внимание, что при использовании ApplicationPoolIdentity (по умолчанию) идентификационное имя равно IIS AppPool\YourAppPoolNameHere.

III. Настройте IIS для поддержки SSL

Используя IIS Manager, найдите свой веб-сайт и добавьте привязку https с вашим mywebserver.myprivatedomain.com сертификатом. См. Шаг 4. Настройка временного сертификата службы в IIS для поддержки SSL .

IV. Настройте службы (web.config)

  <system.serviceModel>
    <protocolMapping>
      <add scheme="https" binding="wsHttpBinding" />
    </protocolMapping>
    <bindings>
      <wsHttpBinding>
        <!-- configure wsHttp binding with Transport security mode and clientCredentialType as Certificate -->
        <binding>
          <security mode="Transport">
            <transport clientCredentialType="Certificate"/>            
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
* +1175 * V. Установить клиентские сертификаты

На каждом клиентском компьютере (веб-ферме) скопируйте следующие файлы:

  • MyRootCA.cer
  • MyRootCA.crl
  • MyAmazonClient.pfx

Используя оснастку MMC «Сертификаты» на клиентских компьютерах, установите сертификаты в следующих местах:

  • MyRootCA.cer и MyRootCA.crl в Local Computer > Trusted Root Certification Authorities > Certificates
  • MyAmazonClient.pfx в Local Computer > Personal > Certificates

Предоставьте вашему IIS AppPool доступ к закрытому ключу сертификата MyAmazonClient (те же действия, что и II ).

VI. Сконфигурируйте клиентов (web.config)

  <system.serviceModel>
    <client>
      <!-- this endpoint has an https: address -->
      <endpoint address="https://mywebserver.myprivatedomain.com/service1.svc" 
                behaviorConfiguration="endpointCredentialBehavior"
                binding="wsHttpBinding" 
                bindingConfiguration="Binding1" 
                contract="MyWebApp.IServiceContract"/>
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="endpointCredentialBehavior">
          <clientCredentials>
            <clientCertificate findValue="MyAmazonClient"
                               storeLocation="LocalMachine"
                               storeName="My"
                               x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <!-- configure wsHttpbinding with Transport security mode
                   and clientCredentialType as Certificate -->
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

И это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...