Vorgehensweise: Sichern eines Diensts mit einem X.509-ZertifikatHow to: Secure a Service with an X.509 Certificate

Die Sicherung eines Diensts mithilfe eines X.509-Zertifikats ist eine grundlegende Technik, die von den meisten Bindungen in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) verwendet wird.Securing a service with an X.509 certificate is a basic technique that most bindings in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) use. Dieses Thema führt durch die Schritte der Konfiguration eines selbst gehosteten Diensts mit einem X.509-Zertifikat.This topic walks through the steps of configuring a self-hosted service with an X.509 certificate.

Eine Voraussetzung ist ein gültiges Zertifikat, das zur Authentifizierung des Diensts verwendet werden kann.A prerequisite is a valid certificate that can be used to authenticate the server. Das Zertifikat muss von einer vertrauenswürdigen Zertifizierungsstelle zum Server ausgegeben werden.The certificate must be issued to the server by a trusted certificate authority. Wenn das Zertifikat ungültig ist, vertrauen die Clients, die versuchen, den Dienst zu verwenden, dem Dienst nicht, und es wird keine Verbindung aufgebaut.If the certificate is not valid, any client trying to use the service will not trust the service, and consequently no connection will be made. Weitere Informationen finden Sie unterFor more information aboutVerwendung von Zertifikaten finden Sie unter arbeiten mit Zertifikaten. using certificates, see Working with Certificates.

So konfigurieren Sie einen Dienst mit einem Zertifikat mithilfe von CodeTo configure a service with a certificate using code

  1. Erstellen Sie den Dienstvertrag und den implementierten Dienst.Create the service contract and the implemented service. Weitere Informationen finden Sie unterFor more information, seeEntwerfen und Implementieren von Diensten. Designing and Implementing Services.

  2. Erstellen Sie eine Instanz der WSHttpBinding-Klasse, und legen Sie deren Sicherheitsmodus auf Message fest. Dies wird im folgenden Code veranschaulicht.Create an instance of the WSHttpBinding class and set its security mode to Message, as shown in the following code.

    // Create a binding and set the security mode to Message.
    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
    
    ' Create a binding and set the security mode to Message.
    Dim b As New WSHttpBinding(SecurityMode.Message)
    
  3. Erstellen Sie zwei Type-Variablen, je eine für den Vertragstyp und den implementierten Vertrag. Dies wird im folgenden Code veranschaulicht.Create two Type variables, one each for the contract type and the implemented contract, as shown in the following code.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Erstellen Sie eine Instanz der Uri-Klasse für die Basisadresse des Diensts.Create an instance of the Uri class for the base address of the service. Da WSHttpBinding den HTTP-Transport nutzt, muss der Uniform Resource Identifier (URI) mit einem Schema beginnen. Andernfalls löst Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) eine Ausnahme aus, wenn der Dienst geöffnet wird.Because the WSHttpBinding uses the HTTP transport, the Uniform Resource Identifier (URI) must begin with that schema, or Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) will throw an exception when the service is opened.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Erstellen Sie eine neue Instanz der ServiceHost-Klasse mit der Variablen des implementierten Vertragstyps und dem URI.Create a new instance of the ServiceHost class with the implemented contract type variable and the URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Fügen Sie einen ServiceEndpoint zum Dienst hinzu, indem Sie die AddServiceEndpoint-Methode verwenden.Add a ServiceEndpoint to the service using the AddServiceEndpoint method. Übergeben Sie den Vertrag, die Bindung und eine Endpunktadresse an den Konstruktor. Dies wird im folgenden Code veranschaulicht.Pass the contract, binding, and an endpoint address to the constructor, as shown in the following code.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Dies ist optional.Optional. Um Metadaten vom Dienst abzufragen, erstellen Sie ein neues ServiceMetadataBehavior-Objekt und legen Sie die HttpGetEnabled-Eigenschaft auf true fest.To retrieve metadata from the service, create a new ServiceMetadataBehavior object and set the HttpGetEnabled property to true.

    ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
    sm.HttpGetEnabled = true;
    sh.Description.Behaviors.Add(sm);
    
    Dim sm As New ServiceMetadataBehavior()
    sm.HttpGetEnabled = True
    
    With sh
        .Description.Behaviors.Add(sm)
    
  8. Verwenden Sie die SetCertificate-Methode der X509CertificateRecipientServiceCredential-Klasse, um das gültige Zertifikat zum Dienst hinzuzufügen.Use the SetCertificate method of the X509CertificateRecipientServiceCredential class to add the valid certificate to the service. Die Methode kann eine von diversen Methoden nutzen, um ein Zertifikat zu suchen.The method can use one of several methods to find a certificate. In diesem Beispiel wird die FindBySubjectName-Enumeration verwendet.This example uses the FindBySubjectName enumeration. Die Enumeration gibt an, dass der gelieferte Wert der Name der Entität ist, an die das Zertifikat herausgegeben wurde.The enumeration specifies that the supplied value is the name of the entity that the certificate was issued to.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Rufen Sie die Open-Methode auf, um die Dienstüberwachung zu starten.Call the Open method to start the service listening. Sollten Sie eine Konsolenanwendung erstellen, rufen Sie die ReadLine-Methode auf, um den Dienst im Überwachungsstatus zu halten.If you are creating a console application, call the ReadLine method to keep the service in the listening state.

    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    .Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

BeispielExample

Im folgenden Beispiel wird die SetCertificate-Methode verwendet, um einen Dienst mit einem X.509-Zertifikat zu konfigurieren.The following example uses the SetCertificate method to configure a service with an X.509 certificate.

// Create a binding and set the security mode to Message.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

Type contractType = typeof(ICalculator);
Type implementedContract = typeof(Calculator);

Uri baseAddress = new Uri("http://localhost:8044/base");

ServiceHost sh = new ServiceHost(implementedContract, baseAddress);

sh.AddServiceEndpoint(contractType, b, "Calculator");

ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
sm.HttpGetEnabled = true;
sh.Description.Behaviors.Add(sm);

sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine ,StoreName.My,
    X509FindType.FindBySubjectName ,"localhost");

sh.Open();
Console.WriteLine("Listening");
Console.ReadLine();
sh.Close();
' Create a binding and set the security mode to Message.
Dim b As New WSHttpBinding(SecurityMode.Message)

Dim contractType = GetType(ICalculator)
Dim implementedContract = GetType(Calculator)

Dim baseAddress As New Uri("http://localhost:8044/base")

Dim sh As New ServiceHost(implementedContract, baseAddress)

sh.AddServiceEndpoint(contractType, b, "Calculator")

Dim sm As New ServiceMetadataBehavior()
sm.HttpGetEnabled = True

With sh
    .Description.Behaviors.Add(sm)

    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")

    .Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    .Close()
End With

Kompilieren des CodesCompiling the Code

Die folgenden Namespaces sind zum Kompilieren des Codes erforderlich:The following namespaces are required to compile the code:

Siehe auchSee Also

Arbeiten mit ZertifikatenWorking with Certificates