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


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

При создании локальной службы Windows Communication Foundation (WCF) с WSHttpBinding классом, использующим безопасность транспорта, необходимо также настроить порт с сертификатом X.509. Если вы не создаете самостоятельно размещаемую службу, вы можете разместить вашу службу в службах Internet Information Services (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. Удалите все пробелы между шестнадцатеричными символами. Одним из способов этого является использование функции поиска и замены текстового редактора и замены каждого пробела пустым символом.

Привязка 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={00001111-aaaa-2222-bbbb-3333cccc4444}
    
    • Параметр 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={00001111-aaaa-2222-bbbb-3333cccc4444} 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 @ {address}");
    Console.WriteLine("Press enter to close the service");
    Console.ReadLine();
    sh.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine($"A communication error occurred: {ce.Message}");
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine($"An unforeseen error occurred: {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

См. также