Практическое руководство. Защита службы с использованием сертификата X.509

Защита службы с помощью сертификата X.509 — это базовый способ использования большинства привязок в Windows Communication Foundation (WCF). В этом разделе описывается порядок настройки резидентной службы с сертификатом X.509.

Предварительным условием является наличие действительного сертификата, который можно использовать для проверки подлинности сервера. Сертификат должен быть выдан серверу доверенным центром сертификации. Если сертификат недействителен, ни один клиент, пытающийся воспользоваться службой, не будет доверять этой службе, следовательно, соединение установлено не будет. Дополнительные сведения об использовании сертификатов см. в статье "Работа с сертификатами".

Настройка службы с сертификатом в коде

  1. Создайте контракт службы и реализованную службу. Дополнительные сведения см. в разделе "Проектирование и реализация служб".

  2. Создайте экземпляр класса WSHttpBinding и установите для него режим безопасности Message, как показано в следующем коде.

    // 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. Создайте две переменные типа Type, по одной для типа контракта и реализованного контракта, как показано в следующем коде.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Создайте экземпляр класса Uri для базового адреса службы. WSHttpBinding Так как используется транспорт HTTP, универсальный идентификатор ресурса (URI) должен начинаться с этой схемы, или Windows Communication Foundation (WCF) вызовет исключение при открытии службы.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Создайте новый экземпляр класса ServiceHost с переменной реализованного контракта и URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Добавьте в службу экземпляр класса ServiceEndpoint с помощью метода AddServiceEndpoint. Передайте контракт, привязку и адрес конечной точки конструктору, как показано в следующем коде.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Необязательно. Чтобы извлекать метаданные из службы, создайте новый объект ServiceMetadataBehavior и присвойте свойству HttpGetEnabled значение 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 класса X509CertificateRecipientServiceCredential добавьте в службу действительный сертификат. Для поиска сертификата в этом методе можно использовать один из нескольких способов. В этом примере используется перечисление FindBySubjectName. Это перечисление указывает, что переданное значение представляет собой имя сущности, которой был выдан сертификат.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Вызовите метод Open, чтобы служба начала прослушивание. Если создается консольное приложение, вызовите метод ReadLine, чтобы служба оставалась в состоянии прослушивания.

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

Пример

В следующем примере показана настройка службы с сертификатом X.509 с помощью метода SetCertificate.

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

Компиляция кода

Для компиляции кода требуются следующие пространства имен.

См. также