Практическое руководство. Настройка порта с использованием SSL-сертификата

При создании локальной службы Windows Communication Foundation (WCF) с WSHttpBinding классом, использующим безопасность транспорта, необходимо также настроить порт с сертификатом X.509. При создании нерезидентной службы можно разместить ее в службах IIS. Дополнительные сведения см. в разделе "Безопасность транспорта HTTP".

Выбор средства для настройки порта зависит от операционной системы компьютера.

Если вы используете Windows Server 2003, используйте средство HttpCfg.exe. В Windows Server 2003 этот инструмент устанавливается. Дополнительные сведения см. в разделе "Обзор Httpcfg". Документация по средствам поддержки Windows объясняет синтаксис средства Httpcfg.exe.

Если вы используете Windows Vista, используйте средство Netsh.exe, которое уже установлено.

Примечание.

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

Определение настройки портов

  1. В Windows Server 2003 или Windows XP используйте средство HttpCfg.exe для просмотра текущей конфигурации порта с помощью запросов и 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 с ключевое слово удаления и ssl. Используйте переключатель -i, чтобы указать значение :port число и параметр -h, чтобы указать IPотпечаток.

    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.
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 certificate 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 communication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}
' 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 certificate 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 communication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try

См. также