Nachrichtensicherheit durch gegenseitige ZertifikateMessage Security with Mutual Certificates

Das folgende Szenario zeigt, wie ein Client und ein Dienst von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) mit dem Nachrichtensicherheitsmodus gesichert werden.The following scenario shows a Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) service and client secured using message security mode. Sowohl der Client als auch der Dienst werden mit Zertifikaten authentifiziert.The client and the service are authenticated with certificates.

Dieses Szenario ist interoperabel, da es WS-Sicherheit mit dem X.509-Zertifikatstokenprofil verwendet.This scenario is interoperable because it uses WS-Security with the X.509 certificate token profile.

Hinweis

Dieses Szenario führt keine Aushandlung für das Dienstzertifikat aus.This scenario does not perform negotiation of the service certificate. Das Dienstzertifikat muss dem Client vor jeder Kommunikation bereitgestellt werden.The service certificate must be provided to the client in advance of any communication. Das Serverzertifikat kann mit der Anwendung oder im Rahmen einer Out-of-Band-Kommunikation bereitgestellt werden.The server certificate can be distributed with the application or provided in an out-of-band communication.

Nachrichtensicherheit durch gegenseitige ZertifikateMessage security with mutual certificates

MerkmalCharacteristic BeschreibungDescription
SicherheitsmodusSecurity Mode MeldungMessage
InteroperabilitätInteroperability Ja, mit WS-Sicherheit und X.509-Zertifikatstokenprofil kompatible Clients und Dienste.Yes, with WS-Security and X.509 certificate token profile compatible clients and services.
AuthentifizierungAuthentication Gegenseitige Authentifizierung des Servers und des Clients.Mutual authentication of the server and client.
IntegritätIntegrity JaYes
VertraulichkeitConfidentiality JaYes
TransportTransport HTTPHTTP
BindungBinding WSHttpBinding

DienstService

Der folgende Code und die folgende Konfiguration werden unabhängig voneinander ausgeführt.The following code and configuration are meant to run independently. Führen Sie einen der folgenden Schritte aus:Do one of the following:

  • Erstellen Sie einen separaten Dienst, indem Sie den Code ohne Konfiguration verwenden.Create a stand-alone service using the code with no configuration.

  • Erstellen Sie mit der angegebenen Konfiguration einen Dienst, aber definieren Sie keine Endpunkte.Create a service using the supplied configuration, but do not define any endpoints.

CodeCode

Im folgenden Code wird gezeigt, wie ein Dienstendpunkt, der Nachrichtensicherheit verwendet, erstellt wird.The following code shows creates a service endpoint that uses message security. Der Dienst benötigt ein Zertifikat, um sich zu authentifizieren.The service requires a certificate to authenticate itself.

// Create the binding. 
WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType =
    MessageCredentialType.Certificate;
binding.Security.Message.NegotiateServiceCredential = false;
binding.Security.Message.EstablishSecurityContext = false;

// Create the URI for the endpoint.
Uri httpUri = new Uri("http://localhost/Calculator");

// Create the service host.
ServiceHost myServiceHost =
    new ServiceHost(typeof(Calculator), httpUri);

// Specify a certificate to authenticate the service.
myServiceHost.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindBySubjectName,
    "contoso.com");

// Add an endpoint to the service.
myServiceHost.AddServiceEndpoint(typeof(ICalculator), binding, "");

// Open the service.
myServiceHost.Open();
Console.WriteLine("Listening...");
Console.ReadLine();

// Close the service.
myServiceHost.Close();
' Create the binding. 
Dim binding As New WSHttpBinding()
binding.Security.Mode = SecurityMode.Message
binding.Security.Message.ClientCredentialType = _
MessageCredentialType.Certificate
binding.Security.Message.NegotiateServiceCredential = False
binding.Security.Message.EstablishSecurityContext = False

' Create the URI for the endpoint.
Dim httpUri As New Uri("http://localhost/Calculator")

' Create the service host.
Dim myServiceHost As New ServiceHost(GetType(ServiceModel.Calculator), httpUri)

' Specify a certificate to authenticate the service.
myServiceHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
StoreName.My, X509FindType.FindBySubjectName, "contoso.com")

' Add an endpoint to the service.
myServiceHost.AddServiceEndpoint(GetType(ICalculator), binding, "")

' Open the service.
myServiceHost.Open()
Console.WriteLine("Listening...")
Console.ReadLine()

' Close the service.
myServiceHost.Close()

KonfigurationConfiguration

Die folgende Konfiguration kann statt des Codes verwendet werden, um denselben Dienst einzurichten.The following configuration can be used instead of the code to create the same service.

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="serviceCredentialBehavior">  
          <serviceCredentials>  
            <serviceCertificate findValue="Contoso.com"   
                                storeLocation="LocalMachine"  
                                storeName="My"   
                                x509FindType="FindBySubjectName" />  
          </serviceCredentials>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <services>  
      <service behaviorConfiguration="serviceCredentialBehavior"   
               name="ServiceModel.Calculator">  
        <endpoint address="http://localhost/Calculator"   
                  binding="wsHttpBinding"  
                  bindingConfiguration="InteropCertificateBinding"  
                  name="WSHttpBinding_ICalculator"  
                  contract="ServiceModel.ICalculator" />  
      </service>  
    </services>  
    <bindings>  
      <wsHttpBinding>  
        <binding name="InteropCertificateBinding">  
          <security mode="Message">  
            <message clientCredentialType="Certificate"  
                     negotiateServiceCredential="false"  
                     establishSecurityContext="false" />  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  
    <client />  
  </system.serviceModel>  
</configuration>  

ClientClient

Der folgende Code und die folgende Konfiguration werden unabhängig voneinander ausgeführt.The following code and configuration are meant to run independently. Führen Sie einen der folgenden Schritte aus:Do one of the following:

  • Erstellen Sie mit dem Code (und Clientcode) einen eigenständigen Client.Create a stand-alone client using the code (and client code).

  • Erstellen Sie einen Client, der keine Endpunktadressen definiert.Create a client that does not define any endpoint addresses. Verwenden Sie stattdessen den Clientkonstruktor, der den Konfigurationsnamen als Argument verwendet.Instead, use the client constructor that takes the configuration name as an argument. Beispiel:For example:

    CalculatorClient cc = new CalculatorClient("EndpointConfigurationName");
    
    Dim cc As New CalculatorClient("EndpointConfigurationName")
    

CodeCode

Der folgende Code erstellt den Client.The following code creates the client. Der Sicherheitsmodus wird auf "Nachricht" und der Clientanmeldeinformationstyp wird auf "Zertifikat" eingestellt.The security mode is set to Message, and the client credential type is set to Certificate.

// Create the binding.
WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
    MessageCredentialType.Certificate;

// Disable credential negotiation and the establishment of 
// a security context.
myBinding.Security.Message.NegotiateServiceCredential = false;
myBinding.Security.Message.EstablishSecurityContext = false;

// Create the endpoint address. 
EndpointAddress ea = new
    EndpointAddress("http://machineName/Calculator");

// Create the client. 
CalculatorClient cc =
    new CalculatorClient(myBinding, ea);

// Specify a certificate to use for authenticating the client.
cc.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.CurrentUser,
    StoreName.My,
    X509FindType.FindBySubjectName,
    "Cohowinery.com");

// Specify a default certificate for the service.
cc.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
    StoreLocation.CurrentUser,
    StoreName.TrustedPeople,
    X509FindType.FindBySubjectName,
    "Contoso.com");

// Begin using the client.
try
{
    cc.Open();
    Console.WriteLine(cc.Add(200, 1111));
    Console.ReadLine();

    // Close the client.
    cc.Close();
}
' Create the binding.
Dim myBinding As New WSHttpBinding()
myBinding.Security.Mode = SecurityMode.Message
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate

' Disable credential negotiation and the establishment of 
' a security context.
myBinding.Security.Message.NegotiateServiceCredential = False
myBinding.Security.Message.EstablishSecurityContext = False

' Create the endpoint address. 
Dim ea As New EndpointAddress("http://localhost/Calculator")

' Create the client. 
Dim cc As New CalculatorClient(myBinding, ea)

' Specify a certificate to use for authenticating the client.
cc.ClientCredentials.ClientCertificate.SetCertificate( _
    StoreLocation.CurrentUser, StoreName.My, _
    X509FindType.FindBySubjectName, "Cohowinery.com")

' Specify a default certificate for the service.
cc.ClientCredentials.ServiceCertificate.SetDefaultCertificate( _
    StoreLocation.CurrentUser, StoreName.TrustedPeople, _
    X509FindType.FindBySubjectName, "Contoso.com")

' Begin using the client.
Try
    cc.Open()

    Console.WriteLine(cc.Add(100, 11))
    Console.ReadLine()

    ' Close the client.
    cc.Close()
Catch tex As TimeoutException
    Console.WriteLine(tex.Message)
    cc.Abort()
Catch cex As CommunicationException
    Console.WriteLine(cex.Message)
    cc.Abort()
Finally
    Console.WriteLine("Closed the client")
    Console.ReadLine()
End Try

KonfigurationConfiguration

Der Client wird wie folgt konfiguriert.The following configures the client. Ein Clientzertifikat muss angegeben werden, mithilfe der <ClientCertificate >.A client certificate must be specified using the <clientCertificate>. Darüber hinaus wird das Dienstzertifikat mithilfe angegeben die <DefaultCertificate >.Also, the service certificate is specified using the <defaultCertificate>.

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>  
        <behavior name="ClientCredentialsBehavior">  
          <clientCredentials>  
            <clientCertificate findValue="Cohowinery.com"   
                 storeLocation="CurrentUser"  
                 storeName="My"  
                 x509FindType="FindBySubjectName" />  
            <serviceCertificate>  
              <defaultCertificate findValue="Contoso.com"   
                                  storeLocation="CurrentUser"  
                                  storeName="TrustedPeople"  
                                  x509FindType="FindBySubjectName" />  
            </serviceCertificate>  
          </clientCredentials>  
        </behavior>  
      </endpointBehaviors>  
    </behaviors>  
    <bindings>  
      <wsHttpBinding>  
        <binding name="WSHttpBinding_ICalculator" >  
          <security mode="Message">  
            <message clientCredentialType="Certificate"   
                     negotiateServiceCredential="false"  
                     establishSecurityContext="false" />  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  
    <client>  
      <endpoint address="http://machineName/Calculator"   
                behaviorConfiguration="ClientCredentialsBehavior"  
                binding="wsHttpBinding"   
                bindingConfiguration="WSHttpBinding_ICalculator"  
                contract="ICalculator"  
                name="WSHttpBinding_ICalculator">  
        <identity>  
          <certificate encodedValue="Encoded_Value_Not_Shown" />  
        </identity>  
      </endpoint>  
    </client>  
  </system.serviceModel>  
</configuration>  

Siehe auchSee Also

Übersicht über die SicherheitSecurity Overview
Sicherheitsmodell für Windows Server AppFabricSecurity Model for Windows Server App Fabric
Vorgehensweise: Erstellen und Installieren von temporären Zertifikaten in WCF für die Transportsicherheit während der EntwicklungHow to: Create and Install Temporary Certificates in WCF for Transport Security During Development