Vorgehensweise: Sichern eines Diensts mit einem X.509-Zertifikat

Das Schützen eines Diensts mit einem X.509-Zertifikat ist eine grundlegende Technik, die von den meisten Bindungen in Windows Communication Foundation (WCF) verwendet wird. Dieses Thema führt durch die Schritte der Konfiguration eines selbst gehosteten Diensts mit einem X.509-Zertifikat.

Eine Voraussetzung ist ein gültiges Zertifikat, das zur Authentifizierung des Diensts verwendet werden kann. Das Zertifikat muss von einer vertrauenswürdigen Zertifizierungsstelle zum Server ausgegeben werden. Wenn das Zertifikat ungültig ist, vertrauen die Clients, die versuchen, den Dienst zu verwenden, dem Dienst nicht, und es wird keine Verbindung aufgebaut. Weitere Informationen zu Zertifikaten finden Sie unter Arbeiten mit Zertifikaten.

So konfigurieren Sie einen Dienst mit einem Zertifikat mithilfe von Code

  1. Erstellen Sie den Dienstvertrag und den implementierten Dienst. Weitere Informationen finden Sie unter Entwerfen und Implementieren von Diensten.

  2. Erstellen Sie eine Instanz der WSHttpBinding-Klasse, und legen Sie deren Sicherheitsmodus auf Message fest. Dies wird im folgenden Code veranschaulicht.

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

    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. Da WSHttpBinding den HTTP-Transport nutzt, muss der Uniform Resource Identifier (URI) mit einem Schema beginnen. Andernfalls löst Windows Communication Foundation (WCF) eine Ausnahme aus, wenn der Dienst geöffnet wird.

    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.

    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. Übergeben Sie den Vertrag, die Bindung und eine Endpunktadresse an den Konstruktor. Dies wird im folgenden Code veranschaulicht.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Optional. Um Metadaten vom Dienst abzufragen, erstellen Sie ein neues ServiceMetadataBehavior-Objekt und legen Sie die HttpGetEnabled-Eigenschaft auf true fest.

    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. Die Methode kann eine von diversen Methoden nutzen, um ein Zertifikat zu suchen. In diesem Beispiel wird die FindBySubjectName-Enumeration verwendet. Die Enumeration gibt an, dass der gelieferte Wert der Name der Entität ist, an die das Zertifikat herausgegeben wurde.

    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. Sollten Sie eine Konsolenanwendung erstellen, rufen Sie die ReadLine-Methode auf, um den Dienst im Überwachungsstatus zu halten.

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

Beispiel

Im folgenden Beispiel wird die SetCertificate-Methode verwendet, um einen Dienst mit einem X.509-Zertifikat zu konfigurieren.

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

Die folgenden Namespaces sind zum Kompilieren des Codes erforderlich:

Siehe auch