Transportsäkerhet med certifikatautentisering
Den här artikeln beskriver hur du använder X.509-certifikat för server- och klientautentisering när du använder transportsäkerhet. Mer information om X.509-certifikat finns i Certifikat för offentliga X.509-nycklar. Certifikat måste utfärdas av en certifikatutfärdare, som ofta är utfärdare av certifikat från tredje part. På en Windows Server-domän kan Active Directory Certificate Services användas för att utfärda certifikat till klientdatorer på domänen. I det här scenariot finns tjänsten under Internet Information Services (IIS) som konfigureras med Secure Sockets Layer (SSL). Tjänsten har konfigurerats med ett SSL-certifikat (X.509) så att klienter kan verifiera serverns identitet. Klienten är också konfigurerad med ett X.509-certifikat som gör att tjänsten kan verifiera klientens identitet. Serverns certifikat måste vara betrott av klienten och klientens certifikat måste vara betrott av servern. Den faktiska mekaniken för hur tjänsten och klienten verifierar varandras identitet ligger utanför omfånget för den här artikeln. Mer information finns i Digital signatur på Wikipedia.
Det här scenariot implementerar ett mönster för begäran/svarsmeddelande enligt följande diagram.
Mer information om hur du använder ett certifikat med en tjänst finns i Arbeta med certifikat och Så här konfigurerar du en port med ett SSL-certifikat. I följande tabell beskrivs de olika egenskaperna för scenariot.
Characteristic | beskrivning |
---|---|
Säkerhetsläge | Transport |
Samverkan | Med befintliga webbtjänstklienter och -tjänster. |
Autentisering (server) Autentisering (klient) |
Ja (med ett SSL-certifikat) Ja (med ett X.509-certifikat) |
Dataintegritet | Ja |
Datasekretess | Ja |
Transport | HTTPS |
Bindning | WSHttpBinding |
Konfigurera tjänsten
Eftersom tjänsten i det här scenariot finns under IIS konfigureras den med en web.config-fil. Följande web.config visar hur du konfigurerar WSHttpBinding att använda transportsäkerhet och X.509-klientautentiseringsuppgifter.
<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>
Konfigurera klienten
Klienten kan konfigureras i kod eller i en app.config-fil. I följande exempel visas hur du konfigurerar klienten i kod.
// 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();
Du kan också konfigurera klienten i en App.config-fil enligt följande exempel:
<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>