Как настраивать порт с использованием SSL-сертификата
При создании резидентной службы Windows Communication Foundation (WCF) с классом WSHttpBinding, использующим безопасность транспорта, нужно также настроить порт с сертификатом X.509. При создании нерезидентной службы можно разместить ее в службах IIS. Дополнительные сведения см. в разделе Безопасность транспорта HTTP.
Выбор средства для настройки порта зависит от операционной системы компьютера.
При работе в Windows Server 2003 или Windows XP следует использовать средство HttpCfg.exe. Это средство установлено в Windows Server 2003. В Windows XP средство можно загрузить на веб-сайте Средства поддержки Windows XP Service Pack 2. Дополнительные сведения см. в разделе Общие сведения о средствах Httpcfg. В документации по средствам поддержки Windows описывается синтаксис средства Httpcfg.exe.
При работе в Windows Vista следует использовать установленное средство Netsh.exe.
В этом разделе описывается выполнение нескольких процедур.
Определение текущей конфигурации портов компьютера.
Возвращение отпечатка сертификата (необходимо для выполнения следующих двух процедур).
Выполнение привязки SSL-сертификата к конфигурации порта.
Выполнение привязки SSL-сертификата к конфигурации порта и поддержка сертификатов клиента.
Удаление SSL-сертификата из номера порта.
Обратите внимание, что для изменения сертификатов, хранящихся на компьютере, требуются привилегии администратора.
Определение конфигурации портов
Для просмотра текущей конфигурации портов в Windows Server 2003 или Windows XP следует использовать средство HttpCfg.exe с переключателями query и ssl, как показано в следующем примере.
httpcfg query ssl
Для просмотра текущей конфигурации портов в Windows Vista следует использовать средство Netsh.exe, как показано в следующем примере.
netsh http show sslcert
Возвращение отпечатка сертификата
С помощью оснастки MMC найдите сертификат X.509, который используется для проверки подлинности клиента. Дополнительные сведения см. в разделе Как просматривать сертификаты с помощью оснастки консоли MMC.
Получите доступ к отпечатку сертификата. Дополнительные сведения см. в разделе Как извлечь отпечаток сертификата.
Скопируйте отпечаток сертификата в текстовый редактор, например "Блокнот".
Удалите все пробелы между шестнадцатеричными символами. Эту задачу можно выполнить, в том числе, с помощью функции поиска и замены текстового редактора, заменив каждый пробел символом null.
Выполнение привязки SSL-сертификата к номеру порта
Для выполнения привязки сертификата к номеру порта в Windows Server 2003 или Windows XP следует использовать средство HttpCfg.exe в режиме "set" в хранилище SSL. Это средство использует отпечаток для идентификации сертификата, как показано в следующем примере.
httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
Переключатель -i имеет синтаксис IP:port и указывает средству установить сертификат на порт 8012 компьютера. Дополнительно, четыре нуля, предшествующие номеру, можно заменить на фактический IP-адрес компьютера.
Переключатель -h задает отпечаток сертификата.
В Windows Vista следует использовать средство Netsh.exe, как показано в следующем примере.
netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
Параметр certhash задает отпечаток сертификата.
Параметр ipport задает IP-адрес и порт, он функционирует так же, как описанный выше переключатель -i средства Httpcfg.exe.
Параметр appid представляет собой идентификатор GUID, который можно использовать для определения приложения-владельца.
Выполнение привязки SSL-сертификата к номеру порта и поддержка сертификатов клиента
В Windows Server 2003 или Windows XP для поддержки клиентов, проходящих проверку подлинности с сертификатами X.509 на транспортном уровне, необходимо выполнить вышеописанные процедуры и передать дополнительный параметр командной строки средству HttpCfg.exe, как показано в следующем примере.
httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6 -f 2
Параметр -f имеет синтаксис n, где n — это число от 1 до 7. Как показано в предыдущем примере, значение 2 включает сертификаты клиента на транспортном уровне. Значение 3 включает сертификаты клиента и сопоставляет их учетной записи Windows. Поведение других значений описано в справке средства HttpCfg.exe.
В Windows Vista для поддержки клиентов, проходящих проверку подлинности с сертификатами X.509 на транспортном уровне, необходимо выполнить вышеописанные процедуры, используя дополнительный параметр, как показано в следующем примере.
netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable
Удаление SSL-сертификата из номера порта
Для просмотра портов и отпечатков всех привязок на компьютере следует использовать средство HttpCfg.exe или Netsh.exe. Для вывода информации на диск используйте символ перенаправления «>», как показано в следующем примере.
httpcfg query ssl>myMachinePorts.txt
В Windows Server 2003 или Windows XP используйте средство HttpCfg.exe с ключевыми словами delete и ssl. Используйте переключатель -i для задания номера IP:port, а переключатель -h — для задания отпечатка.
httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
В Windows Vista следует использовать средство Netsh.exe, как показано в следующем примере.
Netsh http delete sslcert ipport=0.0.0.0:8005
Пример
В следующем примере кода показано, как создавать резидентную службу с использованием класса WSHttpBinding, установленного на безопасность транспорта. При создании приложения необходимо задать номер порта в адресе.
' This string uses a function to prepend the computer name at run time.
Dim addressHttp As String = String.Format("http://{0}:8080/Calculator", _
System.Net.Dns.GetHostEntry("").HostName)
Dim b As New WSHttpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate
' You must create an array of URI objects to have a base address.
Dim a As New Uri(addressHttp)
Dim baseAddresses() As Uri = {a}
' Create the ServiceHost. The service type (Calculator) is not
' shown here.
Dim sh As New ServiceHost(GetType(Calculator), baseAddresses)
' Add an endpoint to the service. Insert the thumbprint of an X.509
' certificate found on your computer.
Dim c As Type = GetType(ICalculator)
sh.AddServiceEndpoint(c, b, "MyCalculator")
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindBySubjectName, _
"contoso.com")
' This next line is optional. It specifies that the client's certificate
' does not have to be issued by a trusted authority, but can be issued
' by a peer if it is in the Trusted People store. Do not use this setting
' for production code. The default is PeerTrust, which specifies that
' the certificate must originate from a trusted certifiate authority.
' sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
' X509CertificateValidationMode.PeerOrChainTrust
Try
sh.Open()
Dim address As String = sh.Description.Endpoints(0).ListenUri.AbsoluteUri
Console.WriteLine("Listening @ {0}", address)
Console.WriteLine("Press enter to close the service")
Console.ReadLine()
sh.Close()
Catch ce As CommunicationException
Console.WriteLine("A commmunication error occurred: {0}", ce.Message)
Console.WriteLine()
Catch exc As System.Exception
Console.WriteLine("An unforseen error occurred: {0}", exc.Message)
Console.ReadLine()
End Try
// This string uses a function to prepend the computer name at run time.
string addressHttp = String.Format(
"http://{0}:8080/Calculator",
System.Net.Dns.GetHostEntry("").HostName);
WSHttpBinding b = new WSHttpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
// You must create an array of URI objects to have a base address.
Uri a = new Uri(addressHttp);
Uri[] baseAddresses = new Uri[] { a };
// Create the ServiceHost. The service type (Calculator) is not
// shown here.
ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddresses);
// Add an endpoint to the service. Insert the thumbprint of an X.509
// certificate found on your computer.
Type c = typeof(ICalculator);
sh.AddServiceEndpoint(c, b, "MyCalculator");
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
"contoso.com");
// This next line is optional. It specifies that the client's certificate
// does not have to be issued by a trusted authority, but can be issued
// by a peer if it is in the Trusted People store. Do not use this setting
// for production code. The default is PeerTrust, which specifies that
// the certificate must originate from a trusted certifiate authority.
// sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
// X509CertificateValidationMode.PeerOrChainTrust;
try
{
sh.Open();
string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
Console.WriteLine("Listening @ {0}", address);
Console.WriteLine("Press enter to close the service");
Console.ReadLine();
sh.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("A commmunication error occurred: {0}", ce.Message);
Console.WriteLine();
}
catch (System.Exception exc)
{
Console.WriteLine("An unforseen error occurred: {0}", exc.Message);
Console.ReadLine();
}