Безопасность транспорта с проверкой подлинности с использованием сертификатов
В этой статье описывается использование сертификатов X.509 для проверки подлинности сервера и клиента при использовании безопасности транспорта. Дополнительные сведения о сертификатах X.509 см. в разделе Сертификаты открытого ключа X.509. Сертификаты должны выдаваться центром сертификации, который обычно является сторонним издателем сертификатов. В домене Windows Server для выдачи сертификатов клиентским компьютерам домена можно использовать службу сертификации Active Directory. В этом сценарии служба размещена в службах IIS, которые используют протокол SSL. В службе задано использование сертификата SSL (X.509), чтобы клиенты могли проверять подлинность сервера. В клиенте также задано использование сертификата X.509, что позволяет службе проверять подлинность клиента. Клиент должен доверять сертификату сервера, а сервер ― сертификату клиента. Фактическая механика того, как служба и клиент проверяют личность друг друга, выходит за рамки область этой статьи. Дополнительные сведения см. в разделе "Цифровая подпись " в Википедии.
В этом сценарии реализуется шаблон обмена сообщениями «запрос-ответ», показанный на следующей схеме.
Дополнительные сведения об использовании сертификата со службой см. в статье "Работа с сертификатами " и "Практическое руководство. Настройка порта с помощью SSL-сертификата". В следующей таблице описываются различные особенности этого сценария.
Characteristic | Description |
---|---|
Режим безопасности | Транспорт |
Совместимость | С существующими службами и клиентами веб-служб. |
Проверка подлинности (сервера) Проверка подлинности (клиента) |
Да (с использованием SSL-сертификата) Да (с использованием сертификата X.509) |
Целостность данных | Да |
Конфиденциальность данных | Да |
Транспорт | HTTPS |
Привязка | WSHttpBinding |
Настройка службы
Поскольку в этом сценарии служба размещается в службах IIS, он настраивается с помощью файла web.config. В следующем примере содержимого файла web.config показано, как настроить в WSHttpBinding использование безопасности транспорта и учетных данных клиента X.509.
<configuration>
<system.serviceModel>
<protocolMapping>
<add scheme="https" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- configure wsHttp binding with Transport security mode and clientCredentialType as Certificate -->
<binding>
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Настройка клиента
Настроить клиент можно в коде или в файле app.config. В следующем примере показано, как настроить клиент в коде.
// Create the binding.
var myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Certificate;
// Create the endpoint address. Note that the machine name
// must match the subject or DNS field of the X.509 certificate
// used to authenticate the service.
var ea = new
EndpointAddress("https://localhost/CalculatorService/service.svc");
// Create the client. The code for the calculator
// client is not shown here. See the sample applications
// for examples of the calculator code.
var cc =
new CalculatorClient(myBinding, ea);
// The client must specify a certificate trusted by the server.
cc.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.My,
X509FindType.FindBySubjectName,
"contoso.com");
// Begin using the client.
Console.WriteLine(cc.Add(100, 1111));
//...
cc.Close();
Также можно настроить клиент в файле App.config, как показано в следующем примере:
<configuration>
<system.serviceModel>
<client>
<!-- this endpoint has an https: address -->
<endpoint address=" https://localhost/CalculatorService/service.svc "
behaviorConfiguration="endpointCredentialBehavior"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.Samples.TransportSecurity.ICalculator"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialBehavior">
<clientCredentials>
<clientCertificate findValue="contoso.com"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<!-- configure wsHttpbinding with Transport security mode
and clientCredentialType as Certificate -->
<binding name="Binding1">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>