2008-12-02 4 views
37

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

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

ответ

44

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

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». Обратите внимание, что сертификаты клиентов подписываются с сертификатом корневого развития органа, созданного на шаге 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> 
+0

Неверный формат XML. К сожалению, мое редактирование было отклонено. Если у вас возникли проблемы, обратите внимание, что `` должно быть ``, а элемент `` отсутствует. Это верно для .NET 4.5, по крайней мере. См. Http://stackoverflow.com/review/spected-edits/7584410 – Jimothy 2015-04-10 04:05:49