Dela via


Anvisningar: Skydda en tjänst med ett X.509-certifikat

Att skydda en tjänst med ett X.509-certifikat är en grundläggande teknik som de flesta bindningar i Windows Communication Foundation (WCF) använder. Det här avsnittet går igenom stegen för att konfigurera en lokalt installerad tjänst med ett X.509-certifikat.

En förutsättning är ett giltigt certifikat som kan användas för att autentisera servern. Certifikatet måste utfärdas till servern av en betrodd certifikatutfärdare. Om certifikatet inte är giltigt kommer alla klienter som försöker använda tjänsten inte att lita på tjänsten och därför görs ingen anslutning. Mer information om hur du använder certifikat finns i Arbeta med certifikat.

Så här konfigurerar du en tjänst med ett certifikat med hjälp av kod

  1. Skapa tjänstkontraktet och den implementerade tjänsten. Mer information finns i Designa och implementera tjänster.

  2. Skapa en instans av WSHttpBinding klassen och ange dess säkerhetsläge till Message, enligt följande kod.

    // 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. Skapa två Type variabler, en var för kontraktstypen och det implementerade kontraktet, enligt följande kod.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Skapa en instans av Uri klassen för tjänstens basadress. WSHttpBinding Eftersom använder HTTP-transporten måste URI (Uniform Resource Identifier) börja med det schemat, eller så utlöser Windows Communication Foundation (WCF) ett undantag när tjänsten öppnas.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Skapa en ny instans av ServiceHost klassen med den implementerade kontraktstypvariabeln och URI:n.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Lägg till en ServiceEndpoint i tjänsten med hjälp av AddServiceEndpoint -metoden. Skicka kontraktet, bindningen och en slutpunktsadress till konstruktorn enligt följande kod.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Valfritt. Om du vill hämta metadata från tjänsten skapar du ett nytt ServiceMetadataBehavior objekt och anger egenskapen HttpGetEnabled till 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. SetCertificate Använd -metoden för X509CertificateRecipientServiceCredential klassen för att lägga till det giltiga certifikatet i tjänsten. Metoden kan använda en av flera metoder för att hitta ett certifikat. I det FindBySubjectName här exemplet används uppräkningen. Uppräkningen anger att det angivna värdet är namnet på den entitet som certifikatet utfärdades till.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Open Anropa metoden för att starta tjänstens lyssnande. Om du skapar ett konsolprogram anropar ReadLine du metoden för att hålla tjänsten i lyssningstillstånd.

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

Exempel

I följande exempel används SetCertificate metoden för att konfigurera en tjänst med ett X.509-certifikat.

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

Kompilera koden

Följande namnområden krävs för att kompilera koden:

Se även