Как использовать средства обеспечения безопасности транспорта и учетные данные сообщения
Механизм защиты службы с помощью учетных данных транспорта и учетных данных сообщения использует лучшие возможности режимов безопасности транспорта (TLS) и сообщений (MLS) в 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 с сертификатом для обеспечения безопасности транспорта (в коде)
Воспользуйтесь средством HttpCfg.exe для привязки SSL-сертификата к порту на компьютере. Дополнительные сведения см. в разделе Как настраивать порт с использованием SSL-сертификата.
Создайте экземпляр класса WSHttpBinding и задайте для свойства Mode значение TransportWithMessageCredential.
Присвойте свойству ClientCredentialType соответствующее значение. (Дополнительные сведения см. в разделе Выбор типа учетных данных.) В следующем коде используется значение Certificate.
Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "HTTPS" и содержать фактическое имя компьютера и номер порта, к которому привязан SSL-сертификат. (Кроме того, базовый адрес можно задать в конфигурации.)
Добавьте конечную точку службы с помощью метода AddServiceEndpoint.
Создайте экземпляр класса ServiceHost и вызовите метод Open, как показано в следующем примере кода.
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()
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();
Использование привязки NetTcpBinding с сертификатом для обеспечения безопасности транспорта (в коде)
Создайте экземпляр класса NetTcpBinding и задайте для свойства Mode значение TransportWithMessageCredential.
Присвойте свойству ClientCredentialType соответствующее значение. В следующем коде используется значение Certificate.
Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "net.tcp". (Кроме того, базовый адрес можно задать в конфигурации.)
Создайте экземпляр класса ServiceHost.
Воспользуйтесь методом SetCertificate класса X509CertificateRecipientServiceCredential, чтобы явно задать сертификат X.509 для службы.
Добавьте конечную точку службы с помощью метода AddServiceEndpoint.
Вызовите метод Open, как показано в следующем примере кода.
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAdddress As New Uri("net.tcp://baseAddress") Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress) 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 b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAdddress = new Uri("net.tcp://baseAddress"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress); 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();
Использование привязки NetTcpBinding с Windows для обеспечения безопасности транспорта (в коде)
Создайте экземпляр класса NetTcpBinding и задайте для свойства Mode значение TransportWithMessageCredential.
Настройте безопасность транспорта на использование Windows, задав для свойства ClientCredentialType значение Windows. (Обратите внимание, что это значение используется по умолчанию.)
Присвойте свойству ClientCredentialType соответствующее значение. В следующем коде используется значение Certificate.
Создайте экземпляр класса Uri с соответствующим базовым адресом. Обратите внимание, что адрес должен использовать схему "net.tcp". (Кроме того, базовый адрес можно задать в конфигурации.)
Создайте экземпляр класса ServiceHost.
Воспользуйтесь методом SetCertificate класса X509CertificateRecipientServiceCredential, чтобы явно задать сертификат X.509 для службы.
Добавьте конечную точку службы с помощью метода AddServiceEndpoint.
Вызовите метод Open, как показано в следующем примере кода.
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAdddress As New Uri("net.tcp://Tcp") Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress) 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 b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAdddress = new Uri("net.tcp://Tcp"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress); 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();
Использование конфигурации
Использование привязки WSHttpBinding
Задайте для компьютера SSL-сертификат, привязанный к порту. (Дополнительные сведения см. в разделе Как настраивать порт с использованием SSL-сертификата). В данной конфигурации задавать значение элемента <transport> не требуется.
Задайте тип учетных данных клиента для MLS. В следующем примере для атрибута clientCredentialType элемента <message> задано значение UserName.
<wsHttpBinding> <binding name="WsHttpBinding_ICalculator"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding>
Использование привязки NetTcpBinding с сертификатом для обеспечения безопасности транспорта
В случае SSL по TCP необходимо явно задать сертификат в элементе <behaviors>. В следующем примере сертификат задается своим издателем в хранилище по умолчанию (в хранилище локального компьютера и личном хранилище).
<behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" x509FindType="FindByIssuerName" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
Добавьте элемент netTcpBinding Element в раздел привязок.
Добавьте элемент привязки и присвойте атрибуту name соответствующее значение.
Добавьте элемент <security> и присвойте атрибуту mode значение TransportWithMessageCredential.
Добавьте элемент <message> и присвойте атрибуту clientCredentialType соответствующее значение.
<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings>
Использование привязки NetTcpBinding с Windows для обеспечения безопасности транспорта
Добавьте элемент netTcpBinding Element в раздел привязок.
Добавьте элемент <binding> и присвойте атрибуту name соответствующее значение.
Добавьте элемент <security> и присвойте атрибуту mode значение TransportWithMessageCredential.
Добавьте элемент <transport> и присвойте атрибуту clientCredentialType значение Windows.
Добавьте элемент <message> и присвойте атрибуту clientCredentialType соответствующее значение. В следующем коде задается значение для сертификата.
<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <transport clientCredentialType="Windows" /> <message clientCredentialType="Certificate" /> </security> </binding> </netTcpBinding> </bindings>