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

Короткий ответ: да, необходим mutex.

Как вы уже упоминали, когда ваш сайт работает в пуле приложений с несколькими рабочими процессами, ваш веб-сайт может выполняться различными процессами.

Необходимая блокировка зависит от типа используемого вами ресурса. Блокировка объекта будет достаточной, если ресурс должен быть потокобезопасным только в этом процессе. Примером этого является HttpApplicationState.

Однако общий ресурс, такой как файл, является внешним по отношению к процессу и не управляется процессом. Блокировка между процессами может быть предоставлена ​​только mutex.

37
задан dsolimano 26 May 2015 в 15:53
поделиться

2 ответа

Следующие шаги являются руководством для запущения Вас:

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

Для генерации Корневого сертификата полномочий разработки можно использовать "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>
44
ответ дан 27 November 2019 в 04:51
поделиться

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

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

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

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

10
ответ дан 27 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: