Короткий ответ
Тип безопасности, который мне нужен: Режим безопасности транспорта с
Сертификат clientCredentialType, используя wsHttpBinding. Первый вопрос,
я прав, предполагая это?
Да. Защита сообщений также будет работать при условии, что вы не используете функции потоковой передачи WCF, но с безопасностью транспорта вы можете воспользоваться аппаратным ускорением.
как мне настроить Certs?
См. Подробный ответ ниже.
Что мне дать клиенту с сервера и куда он девается?
Если у меня есть несколько клиентов (веб-ферма), нужно ли мне
сертификат клиента для всех из них, или они могут поделиться одним сертификатом, что мой сервер
принимает?
Вам необходимо 3 сертификата:
- сертификат клиента (одинаковый для всех клиентов).
- сертификат сервера.
- сертификат центра сертификации (CA), с помощью которого клиентские и серверные сертификаты
были выпущены.
Клиенту необходимо:
- Клиентский сертификат установлен в хранилище личных сертификатов.
- Сертификат CA установлен в хранилище доверенных корневых центров сертификации.
Что мне дать серверу от клиента и куда он идет?
Серверу нужно:
- Сертификат сервера установлен в хранилище личных сертификатов.
- Сертификат CA установлен в хранилище доверенных корневых центров сертификации.
- Сертификат клиента, установленный в хранилище доверенных лиц.
Подробный ответ
В этом сценарии (связь между веб-фермой и автономными веб-службами) у вас есть клиентские и серверные машины. Нет необходимости в выдаче сторонних сертификатов (вы доверяете себе, верно?). Это означает, что вы можете безопасно использовать самодельные сертификаты.
Вот краткое руководство, которое, я надеюсь, поможет вам (или кому-то еще) достичь этого. Если у вас уже есть сертификаты, как подсказывает ваш вопрос, не стесняйтесь пропустить шаг I. Кроме того, вы, возможно, уже купили сертификаты сторонних производителей, в этом случае сертификат корневого центра сертификации (VeriSign, Microsoft и т. Д.) Может быть уже установлен на ваши клиентские и серверные машины.
I. Создать сертификаты
Как объяснено в этой статье MSDN , используйте makecert
для генерации 3 сертификатов:
- Сертификат корневого центра сертификации, назовем его
MyRootCA
и его список отзыва.
- SSL-сертификат сервера. Имя должно быть доменным именем, которое клиенты веб-фермы будут использовать для вызова веб-служб. Например, если ваши клиенты используют следующий URL:
https://mywebserver.myprivatedomain.com/service1.svc
, тогда ваш сертификат CN (Common Name) будет mywebserver.myprivatedomain.com
.
- Сертификат клиента 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>
И это все.