Поделиться через


Как настраивать порт с использованием 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-сертификата из номера порта.

Обратите внимание, что для изменения сертификатов, хранящихся на компьютере, требуются привилегии администратора.

Определение конфигурации портов

  1. Для просмотра текущей конфигурации портов в Windows Server 2003 или Windows XP следует использовать средство HttpCfg.exe с переключателями query и ssl, как показано в следующем примере.

    httpcfg query ssl
    
  2. Для просмотра текущей конфигурации портов в Windows Vista следует использовать средство Netsh.exe, как показано в следующем примере.

    netsh http show sslcert
    

Возвращение отпечатка сертификата

  1. С помощью оснастки MMC найдите сертификат X.509, который используется для проверки подлинности клиента. Дополнительные сведения см. в разделе Как просматривать сертификаты с помощью оснастки консоли MMC.

  2. Получите доступ к отпечатку сертификата. Дополнительные сведения см. в разделе Как извлечь отпечаток сертификата.

  3. Скопируйте отпечаток сертификата в текстовый редактор, например "Блокнот".

  4. Удалите все пробелы между шестнадцатеричными символами. Эту задачу можно выполнить, в том числе, с помощью функции поиска и замены текстового редактора, заменив каждый пробел символом null.

Выполнение привязки SSL-сертификата к номеру порта

  1. Для выполнения привязки сертификата к номеру порта в 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 задает отпечаток сертификата.

  2. В 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-сертификата к номеру порта и поддержка сертификатов клиента

  1. В 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.

  2. В 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-сертификата из номера порта

  1. Для просмотра портов и отпечатков всех привязок на компьютере следует использовать средство HttpCfg.exe или Netsh.exe. Для вывода информации на диск используйте символ перенаправления «>», как показано в следующем примере.

    httpcfg query ssl>myMachinePorts.txt
    
  2. В Windows Server 2003 или Windows XP используйте средство HttpCfg.exe с ключевыми словами delete и ssl. Используйте переключатель -i для задания номера IP:port, а переключатель -h — для задания отпечатка.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
    
  3. В 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();
}

См. также

Основные понятия

Безопасность транспорта HTTP