Практическое руководство. Использование средств обеспечения безопасности транспорта и учетных данных сообщения

Защита службы с использованием учетных данных транспорта и сообщений использует лучшие режимы безопасности транспорта и сообщений в Windows Communication Foundation (WCF). В общих словах, TLS обеспечивает целостность и конфиденциальность, а MLS предоставляет различные учетные данные, которые невозможно использовать в строгих механизмах обеспечения безопасности транспорта. В этом разделе приведены основные этапы реализации транспорта с учетными данными сообщения с помощью привязок WSHttpBinding и NetTcpBinding. Дополнительные сведения о настройке режима безопасности см. в разделе "Практическое руководство. Настройка режима безопасности".

При задании режима безопасностиTransportWithMessageCredential транспорт определяет фактический механизм, обеспечивающий безопасность на транспортном уровне. В случае HTTP таким механизмом является SSL по HTTP (HTTPS); в случае TCP таким механизмом является SSL по TCP или Windows.

Если транспортом является HTTP (используется WSHttpBinding), SSL по HTTP обеспечивает безопасность на транспортном уровне. В этом случае необходимо задать для компьютера, на котором размещена служба, SSL-сертификат, привязанный к порту, как показано далее в этом разделе.

Если транспортом является TCP (используется NetTcpBinding), по умолчанию безопасность на транспортном уровне обеспечивается механизмом безопасности Windows или SSL по TCP. При использовании SSL по TCP необходимо указать сертификат с помощью метода SetCertificate, как показано далее в этом разделе.

Использование привязки WSHttpBinding с сертификатом для обеспечения безопасности транспорта (в коде)

  1. Воспользуйтесь средством HttpCfg.exe для привязки SSL-сертификата к порту на компьютере. Дополнительные сведения см. в разделе "Практическое руководство. Настройка порта с помощью SSL-сертификата".

  2. Создайте экземпляр класса WSHttpBinding и задайте для свойства Mode значение TransportWithMessageCredential.

  3. Присвойте свойству ClientCredentialType соответствующее значение. (Дополнительные сведения см. в разделе Выбор типа учетных данных.) В следующем коде Certificate используется значение.

  4. Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "HTTPS" и содержать фактическое имя компьютера и номер порта, к которому привязан SSL-сертификат. (Кроме того, базовый адрес можно задать в конфигурации.)

  5. Добавьте конечную точку службы с помощью метода AddServiceEndpoint.

  6. Создайте экземпляр класса ServiceHost и вызовите метод Open, как показано в следующем примере кода.

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Uri httpsAddress = new Uri("https://localMachineName:8006/base");
    ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress);
    sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    
    ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Dim httpsAddress As New Uri("https://localMachineName:8006/base")
    Dim sh As New ServiceHost(GetType(Calculator), httpsAddress)
    sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Использование привязки NetTcpBinding с сертификатом для обеспечения безопасности транспорта (в коде)

  1. Создайте экземпляр класса NetTcpBinding и задайте для свойства Mode значение TransportWithMessageCredential.

  2. Присвойте свойству ClientCredentialType соответствующее значение. В следующем коде используется значение Certificate.

  3. Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "net.tcp". (Кроме того, базовый адрес можно задать в конфигурации.)

  4. Создайте экземпляр класса ServiceHost.

  5. Воспользуйтесь методом SetCertificate класса X509CertificateRecipientServiceCredential, чтобы явно задать сертификат X.509 для службы.

  6. Добавьте конечную точку службы с помощью метода AddServiceEndpoint.

  7. Вызовите метод Open, как показано в следующем примере кода.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Использование привязки NetTcpBinding с Windows для обеспечения безопасности транспорта (в коде)

  1. Создайте экземпляр класса NetTcpBinding и задайте для свойства Mode значение TransportWithMessageCredential.

  2. Настройте безопасность транспорта на использование Windows, задав для свойства ClientCredentialType значение Windows. (Обратите внимание, что это значение используется по умолчанию.)

  3. Присвойте свойству ClientCredentialType соответствующее значение. В следующем коде используется значение Certificate.

  4. Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "net.tcp". (Кроме того, базовый адрес можно задать в конфигурации.)

  5. Создайте экземпляр класса ServiceHost.

  6. Воспользуйтесь методом SetCertificate класса X509CertificateRecipientServiceCredential, чтобы явно задать сертификат X.509 для службы.

  7. Добавьте конечную точку службы с помощью метода AddServiceEndpoint.

  8. Вызовите метод Open, как показано в следующем примере кода.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Использование конфигурации

Использование привязки WSHttpBinding

  1. Задайте для компьютера SSL-сертификат, привязанный к порту. (Дополнительные сведения см. в разделе Практическое руководство. Настройка порта с помощью SSL-сертификата). Для этой конфигурации не требуется задать <transport> значение элемента.

  2. Задайте тип учетных данных клиента для MLS. В следующем примере для атрибута><messageэлемента задано clientCredentialType значение .UserName

    <wsHttpBinding>  
    <binding name="WsHttpBinding_ICalculator">  
            <security mode="TransportWithMessageCredential" >  
               <message clientCredentialType="UserName" />  
            </security>  
    </binding>  
    </wsHttpBinding>  
    

Использование привязки NetTcpBinding с сертификатом для обеспечения безопасности транспорта

  1. В случае SSL по TCP необходимо явно задать сертификат в элементе <behaviors>. В следующем примере сертификат задается своим издателем в хранилище по умолчанию (в хранилище локального компьютера и личном хранилище).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. <Добавление netTcpBinding> в раздел привязок

  3. Добавьте элемент привязки и присвойте атрибуту name соответствующее значение.

  4. <>securityДобавьте элемент и задайте для атрибута modeTransportWithMessageCredentialзначение .

  5. <message> Добавьте элемент и задайте clientCredentialType атрибут соответствующим значением.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <message clientCredentialType="Windows" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Использование привязки NetTcpBinding с Windows для обеспечения безопасности транспорта

  1. <Добавьте netTcpBinding> в раздел привязок.

  2. Добавьте элемент <binding> и присвойте атрибуту name соответствующее значение.

  3. <>securityДобавьте элемент и задайте для атрибута modeTransportWithMessageCredentialзначение .

  4. <>transportДобавьте элемент и задайте для атрибута WindowsclientCredentialType значение .

  5. Добавьте элемент <message> и присвойте атрибуту clientCredentialType соответствующее значение. В следующем коде задается значение для сертификата.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <transport clientCredentialType="Windows" />  
           <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

См. также