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