Delen via


Transportbeveiliging met certificaatverificatie

In dit artikel wordt beschreven hoe u X.509-certificaten gebruikt voor server- en clientverificatie bij het gebruik van transportbeveiliging. Zie X.509 Public Key Certificates voor meer informatie over X.509-certificaten. Certificaten moeten worden uitgegeven door een certificeringsinstantie, die vaak een externe verlener van certificaten is. In een Windows Server-domein kan Active Directory Certificate Services worden gebruikt om certificaten uit te geven aan clientcomputers in het domein. In dit scenario wordt de service gehost onder IIS (Internet Information Services), die is geconfigureerd met SSL (Secure Sockets Layer). De service is geconfigureerd met een SSL-certificaat (X.509) zodat clients de identiteit van de server kunnen verifiëren. De client is ook geconfigureerd met een X.509-certificaat waarmee de service de identiteit van de client kan verifiëren. Het certificaat van de server moet worden vertrouwd door de client en het certificaat van de client moet worden vertrouwd door de server. De daadwerkelijke mechanismen van hoe de service en client elkaars identiteit verifieert, valt buiten het bereik van dit artikel. Zie Digitale handtekening op Wikipedia voor meer informatie.

In dit scenario wordt een patroon voor een aanvraag-/antwoordbericht geïmplementeerd, zoals wordt geïllustreerd in het volgende diagram.

Secure transfer using certificates

Zie Werken met certificaten en procedures voor meer informatie over het gebruik van een certificaat met een service: Een poort configureren met een SSL-certificaat. In de volgende tabel worden de verschillende kenmerken van het scenario beschreven.

Characteristic Beschrijving
Beveiligingsmodus Transport
Interoperabiliteit Met bestaande webserviceclients en -services.
Verificatie (server)

Verificatie (client)
Ja (met behulp van een SSL-certificaat)

Ja (met een X.509-certificaat)
Gegevensintegriteit Ja
Vertrouwelijkheid van gegevens Ja
Transport HTTPS
Binding WSHttpBinding

De service configureren

Omdat de service in dit scenario wordt gehost onder IIS, wordt deze geconfigureerd met een web.config-bestand. In de volgende web.config ziet u hoe u de WSHttpBinding clientreferenties voor transportbeveiliging en X.509 configureert.

<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>  

De client configureren

De client kan worden geconfigureerd in code of in een app.config-bestand. In het volgende voorbeeld ziet u hoe u de client configureert in code.

// 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();  

U kunt de client ook configureren in een App.config-bestand, zoals wordt weergegeven in het volgende voorbeeld:

<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>  

Zie ook