Как настроить WCF для использования сертификатов x509 через Интернет? - PullRequest
37 голосов
/ 03 декабря 2008

Мне нужно использовать сертификат x509, чтобы получить безопасную аутентификацию на уровне сообщений от расширенного клиента через Интернет к защищенной веб-службе WCF.

В частности, я ищу пошаговое руководство по настройке, настройке, кодированию и развертыванию, включая создание сертификата dev, его установку и получение «реального» сертификата для производства.

Ответы [ 2 ]

44 голосов
/ 05 декабря 2008

Следующие шаги являются руководством для начала работы:

1) Во-первых, вам нужен Root Authority для генерации сертификатов вашего клиента и сервера. Вы можете использовать внешнего поставщика полномочий (например, Verisign) или создать свой собственный, используя что-то вроде Microsoft Certificate Server.

Для генерации сертификата Root Authority для разработки вы можете использовать инструмент "makecert", который поставляется с Visual Studio, например,

makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer

2) Затем вам необходимо запросить / сгенерировать сертификаты клиента и сервера. Оба типа сертификатов могут быть установлены как сертификаты локального компьютера, и оба должны быть подписаны с использованием одного и того же корневого органа. Вы можете запросить клиентские сертификаты через веб-интерфейс Microsoft Certificate Server, например, http://mycertserver/certsrv.

Чтобы сгенерировать сертификат клиента разработки для каждой машины, вы можете снова использовать «makecert». Обратите внимание, что клиентские сертификаты подписаны с помощью сертификата корневого центра разработки, созданного на шаге 1.

makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert 
         -iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer

Это позволит установить сертификат на компьютере, на котором выполняется команда, в папку «Личные сертификаты» в хранилище локального компьютера.

Чтобы сервер доверял сертификатам клиента, вам необходимо установить сертификат корневого центра разработки в хранилище доверенных корневых центров сертификации сервера (для этого используйте оснастку «Сертификаты mmc»). У клиентов также должен быть установлен корневой сертификат таким же образом, чтобы они доверяли своим собственным сертификатам.

3) Настройте службу WCF так, чтобы она требовала аутентификации клиента с использованием сертификата (например, через web.config).

<services>
  <service
    name="TestService"
    behaviorConfiguration="wsHttpCertificateBehavior">
    <endpoint name="TestEndPoint"
      address=""
      binding="wsHttpBinding"
      bindingConfiguration="wsHttpEndpointBinding"
      contract="TestService.IMyContract">
      <identity>
        <dns value=""/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
  </service>
</services>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <behavior name="wsHttpCertificateBehavior">
    <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
    <serviceCredentials>
      <clientCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck"/>
      </clientCertificate>
      <serverCertificate findValue="CN=MyCert"/>
    </serviceCredentials>
  </behavior>
</behaviors>

4) Теперь настройте абонента (например, через app.config).

<client>
  <endpoint name="wsHttpBinding"
    address="https://localhost/TestService/TestService.svc"
    binding="wsHttpBinding"
    bindingConfiguration="wsHttpBinding"
    behaviorConfiguration="wsHttpCertificateBehavior"
    contract="TestService.IMyContract">
    <identity>
      <dns value="MyCert"/>
    </identity>
  </endpoint>
</client>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
 <endpointBehaviors>
  <behavior name="wsHttpCertificateBehavior">
    <clientCredentials>
      <clientCertificate findValue="MyCert" storeLocation="LocalMachine"/>
      <serviceCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck" 
          trustedStoreLocation="LocalMachine"/>
      </serviceCertificate>
    </clientCredentials>
  </behavior>
 </endpointBehaviors>
</behaviors>
10 голосов
/ 03 декабря 2008

Я бы рекомендовал прочитать руководство по безопасности WCF от Microsoft

Это относится как к этому сценарию, так и ко многим другим

http://www.codeplex.com/WCFSecurityGuide/

редактировать: сейчас на https://archive.codeplex.com/?p=wcfsecurityguide

...