Подтвердить что ты не робот

Как настроить WCF для использования сертификатов x509 через Интернет?

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

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

4b9b3361

Ответ 1

Следующие шаги помогут вам начать:

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

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

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

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

Чтобы создать сертификат клиента разработки для каждой машины, вы можете снова использовать "makecert". Обратите внимание, что сертификаты клиента подписаны с сертификатом Root Authority разработки, созданным на шаге 1.

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

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

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

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>