Delen via


Procedure: Een service beveiligen met een X.509-certificaat

Het beveiligen van een service met een X.509-certificaat is een basistechniek die de meeste bindingen in WCF (Windows Communication Foundation) gebruiken. In dit onderwerp worden de stappen beschreven voor het configureren van een zelf-hostende service met een X.509-certificaat.

Een vereiste is een geldig certificaat dat kan worden gebruikt om de server te verifiëren. Het certificaat moet worden uitgegeven aan de server door een vertrouwde certificeringsinstantie. Als het certificaat niet geldig is, vertrouwt een client die de service probeert te gebruiken niet en wordt er dus geen verbinding gemaakt. Zie Werken met certificaten voor meer informatie over het gebruik van certificaten.

Een service configureren met een certificaat met behulp van code

  1. Maak het servicecontract en de geïmplementeerde service. Zie Services ontwerpen en implementeren voor meer informatie.

  2. Maak een exemplaar van de klasse en stel de WSHttpBinding beveiligingsmodus Messagein op , zoals wordt weergegeven in de volgende 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. Maak twee Type variabelen, één voor het contracttype en het geïmplementeerde contract, zoals wordt weergegeven in de volgende code.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Maak een exemplaar van de Uri klasse voor het basisadres van de service. Omdat het WSHttpBinding http-transport wordt gebruikt, moet de URI (Uniform Resource Identifier) beginnen met dat schema, anders genereert Windows Communication Foundation (WCF) een uitzondering wanneer de service wordt geopend.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Maak een nieuw exemplaar van de ServiceHost klasse met de geïmplementeerde contracttypevariabele en de URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Voeg een ServiceEndpoint aan de service toe met behulp van de AddServiceEndpoint methode. Geef het contract, de binding en een eindpuntadres door aan de constructor, zoals wordt weergegeven in de volgende code.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Optioneel. Als u metagegevens van de service wilt ophalen, maakt u een nieuw ServiceMetadataBehavior object en stelt u de HttpGetEnabled eigenschap in op 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. Gebruik de SetCertificate methode van de X509CertificateRecipientServiceCredential klasse om het geldige certificaat aan de service toe te voegen. De methode kan een van de verschillende methoden gebruiken om een certificaat te vinden. In dit voorbeeld wordt de FindBySubjectName opsomming gebruikt. De opsomming geeft aan dat de opgegeven waarde de naam is van de entiteit waaraan het certificaat is verleend.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Roep de Open methode aan om de service te starten die luistert. Als u een consoletoepassing maakt, roept u de ReadLine methode aan om de service in de luisterstatus te houden.

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

Opmerking

In het volgende voorbeeld wordt de methode gebruikt voor het SetCertificate configureren van een service met een X.509-certificaat.

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

De code compileren

De volgende naamruimten zijn vereist om de code te compileren:

Zie ook