Следующие шаги являются руководством для начала работы:
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>