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


Привязка привязки <>

Общие сведения

Элемент <binding><bindings> элемента позволяет настроить сведения, необходимые для взаимодействия запросов с веб-сайтом.

Сведения о привязке можно настроить при создании веб-сайта или изменить их после создания сайта. Сведения о привязке включают протокол, используемый клиентами для связи с сайтом, IP-адрес сайта, номер порта и заголовок узла.

Элемент <binding> содержит два атрибута для настройки сведений о привязке: bindingInformation и protocol. Атрибут bindingInformation содержит IP-адрес, номер порта и, при необходимости, заголовок узла для сайта. Атрибут протокола определяет протокол, используемый для взаимодействия с сайтом.

Вы можете настроить коллекцию привязок для сайта с помощью диспетчера IIS, выбрав сайт и воспользовавшись ссылками Привязки... или Дополнительные параметры... в области Действия или щелкнув Изменить привязки... в контекстном меню сайта.

СЛУЖБЫ IIS 8.0 или более поздней версии позволяют обеспечить безопасность веб-сайтов с помощью сертификатов в централизованном хранилище сертификатов в Windows Server 2012. Дополнительные сведения см. в статье Поддержка централизованных SSL-сертификатов IIS 8.0: масштабируемость и управляемость SSL.

Элемент привязки позволяет указать тип привязки, используемой для ssl-сертификатов.

Совместимость

Версия Примечания
IIS 10.0 Элемент <binding> не был изменен в IIS 10.0.
IIS 8,5 Элемент <binding> не был изменен в IIS 8.5.
IIS 8,0 Атрибут sslFlags был добавлен для указания привязки, используемой для сертификатов уровня secure Sockets.
IIS 7,5 Элемент <binding> не был изменен в IIS 7.5.
IIS 7.0 Элемент <binding> коллекции появился <bindings> в IIS 7.0.
IIS 6,0 Коллекция <bindings> заменяет разделы свойства ServerBindings в объекте метабазы IIsWebServer IIS 6.0.

Настройка

Элемент <binding> включен в установку iis 7 и более поздних версий по умолчанию.

Установка централизованного хранилища сертификатов

В IIS 8 и более поздних версиях сертификаты в централизованном хранилище сертификатов можно использовать для обеспечения безопасности веб-сайта. Чтобы использовать это хранилище на веб-сервере Windows Server 2012 или более поздней версии, необходимо установить роль централизованного хранилища SSL-сертификатов. Чтобы сделать это с уже установленными службами IIS, выполните следующие действия.

  1. Нажмите клавишу Windows и щелкните диспетчер сервера.
  2. В диспетчер сервера щелкните Управление, а затем — Добавить роли и компоненты.
  3. В мастере добавления ролей и компонентов щелкните страницу Перед началом работы, выберите тип установки, а затем нажмите кнопку Далее на странице Тип установки , выберите место установки и нажмите кнопку Далее на страницах Выбор сервера .
  4. На странице Роли сервера убедитесь, что выбран веб-сервер (IIS), а затем разверните его. Разверните узел Веб-сервер, а затем выберите и разверните узел Безопасность.
  5. Выберите Централизованное хранилище SSL-сертификатов и нажмите кнопку Далее.
  6. На странице Компоненты нажмите кнопку Далее.
  7. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
  8. На странице Результаты нажмите кнопку Закрыть.

Инструкции

Добавление сведений о привязке на сайт

  1. Откройте диспетчер служб IIS:

    • Если вы используете Windows Server 2012 или Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, выберите Сервис, а затем диспетчер служб IIS.
    • Если вы используете Windows 8 или Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
    • Если вы используете Windows Server 2008 или Windows Server 2008 R2:

      • На панели задач нажмите кнопку Пуск, наведите указатель на пункт Администрирование, а затем выберите Пункт Диспетчер служб IIS.
    • Если вы используете Windows Vista или Windows 7:

      • На панели задач нажмите кнопку Пуск, а затем панель управления.
      • Дважды щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
  2. В области Подключения разверните имя сервера, узел Сайты, а затем щелкните веб-сайт, на котором требуется настроить привязки.

  3. В области Действия щелкните Привязки...

  4. В диалоговом окне Привязки сайтов нажмите кнопку Добавить...
    Снимок экрана: диалоговое окно

  5. В диалоговом окне Добавление привязки сайта добавьте сведения о привязке и нажмите кнопку ОК.
    Снимок экрана: диалоговое окно

Создание централизованного хранилища сертификатов

  1. Нажмите кнопку Пуск и нажмите кнопку диспетчер сервера. В диспетчер сервера щелкните Сервис, а затем — Диспетчер служб IIS.
  2. В области Подключения выберите имя сервера.
  3. На домашней странице в области Управление дважды щелкните Централизованные сертификаты.
  4. На панели Действия щелкните Изменить параметры компонентов.
  5. Выберите Включить централизованные сертификаты и введите физический путь. Введите имя пользователя для пути, пароль для пути и подтвердите пароль. Нажмите кнопку ОК.

Конфигурация

Элементы в элементе <bindings> можно добавить <binding> для каждого сайта в файле ApplicationHost.config. Каждый сайт должен иметь по крайней мере одну привязку HTTP или HTTPS для просмотра через Интернет.

Атрибуты

Атрибут Описание
bindingInformation Обязательный строковый атрибут.

Указывает сведения для обмена данными с сайтом. Например, привязка веб-сайта включает IP-адрес (или неопределенные IP-адреса), номер порта и дополнительный заголовок узла, используемый для связи с сайтом.
protocol Обязательный строковый атрибут.

Указывает протокол для взаимодействия с сайтом.
sslFlags Необязательный атрибут uint.

Указывает тип привязки, используемой для ssl-сертификатов.
  • Значение "0" указывает, что безопасное подключение должно быть установлено с использованием сочетания IP-адреса и порта. К сочетанию IP-адреса и порта можно привязать только один сертификат.
  • Значение "1" указывает, что безопасное подключение должно быть установлено с использованием номера порта и имени узла, полученного с помощью указания имени сервера (SNI).
  • Значение "2" указывает, что безопасное подключение должно быть установлено с помощью централизованного хранилища SSL-сертификатов без использования индикатора имени сервера.
  • Значение "3" указывает, что безопасное подключение должно быть установлено с помощью централизованного хранилища SSL-сертификатов, при этом требуется индикатор имени сервера.
Централизованная поддержка SSL-сертификатов позволяет создать централизованное хранилище сертификатов, которое может содержать несколько файлов сертификатов. Вы можете присвоить файлам сертификатов имена, соответствующие именам узлов, которые они содержат. Это позволяет создать привязку, для которых требуется только порт, а не IP-адрес или сочетание имени узла и порта. При появлении запроса IIS сопоставляет порт, определяет имя узла из запроса и выполняет поиск файла сертификата в централизованном хранилище сертификатов с соответствующим именем. Он использует этот сертификат.

При использовании индикатора имени сервера (SNI) имя узла обменивается как часть подтверждения SSL. SNI включается в диалоговом окне Добавление привязки сайта при добавлении привязки с типом HTTPS. Это особенно полезно для SSL-подключений, размещающих несколько серверов на одном сетевом адресе. Дополнительные сведения см. в статье IIS 8.0 Server Name Индикация (SNI): масштабируемость SSL.

Атрибут sslFlags задается только в том случае, если используется протокол https. Значение по умолчанию — 0.

Дочерние элементы

Отсутствует.

Образец конфигурации

В следующем примере определяется сайт с именем Contoso с двумя привязками. Первая привязка предназначена для имени узла "www.contoso.com" на порте 80 для IP-адреса 192.168.0.1, а вторая — для привязки HTTPS для всех IP-адресов через порт 443.

<site name="Contoso" id="2">
   <application path="/" applicationPool="Contoso">
      <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="192.168.0.1:80:www.contoso.com" />
      <binding protocol="https" bindingInformation="*:443:" />
   </bindings>
</site>

Пример кода

В следующих примерах сайт с именем Contoso настраивается с именем узла "www.contoso.com" через порт 80 для IP-адреса 192.168.0.1 и привязкой HTTPS для всех IP-адресов через порт 443.

AppCmd.exe

appcmd.exe set site /site.name:Contoso /+bindings.[protocol='http',bindingInformation='192.168.0.1:80:www.contoso.com']

appcmd.exe set site /site.name:Contoso /+bindings.[protocol='https',bindingInformation='*:443:']

Вы также можете использовать:

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].bindings.[protocol='http',bindingInformation='192.168.0.1:80:www.contoso.com']" /commit:apphost

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].bindings.[protocol='https',bindingInformation='*:443:']" /commit:apphost

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле ApplicationHost.config.

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
          Configuration config = serverManager.GetApplicationHostConfiguration();
          ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
          ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
          ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");

          if (siteElement == null) throw new InvalidOperationException("Element not found!");

          ConfigurationElementCollection bindingsCollection = siteElement.GetCollection("bindings");
          ConfigurationElement bindingElement = bindingsCollection.CreateElement("binding");
          bindingElement["protocol"] = @"http";
          bindingElement["bindingInformation"] = @"192.168.0.1:80:www.contoso.com";
          bindingsCollection.Add(bindingElement);

          ConfigurationElement bindingElement1 = bindingsCollection.CreateElement("binding");
          bindingElement1["protocol"] = @"https";
          bindingElement1["bindingInformation"] = @"*:443:";
          bindingsCollection.Add(bindingElement1);

          serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")

      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim bindingsCollection As ConfigurationElementCollection = siteElement.GetCollection("bindings")

      Dim bindingElement As ConfigurationElement = bindingsCollection.CreateElement("binding")
      bindingElement("protocol") = "http"
      bindingElement("bindingInformation") = "192.168.0.1:80:www.contoso.com"
      bindingsCollection.Add(bindingElement)

      Dim bindingElement1 As ConfigurationElement = bindingsCollection.CreateElement("binding")
      bindingElement1("protocol") = "https"
      bindingElement1("bindingInformation") = "*:443:"
      bindingsCollection.Add(bindingElement1)

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var bindingsCollection = siteElement.ChildElements.Item("bindings").Collection;

var bindingElement = bindingsCollection.CreateNewElement("binding");
bindingElement.Properties.Item("protocol").Value = "http";
bindingElement.Properties.Item("bindingInformation").Value = "192.168.0.1:80:www.contoso.com";
bindingsCollection.AddElement(bindingElement);

var bindingElement1 = bindingsCollection.CreateNewElement("binding");
bindingElement1.Properties.Item("protocol").Value = "https";
bindingElement1.Properties.Item("bindingInformation").Value = "*:443:";
bindingsCollection.AddElement(bindingElement1);

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))

If siteElementPos = -1 Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set bindingsCollection = siteElement.ChildElements.Item("bindings").Collection

Set bindingElement = bindingsCollection.CreateNewElement("binding")
bindingElement.Properties.Item("protocol").Value = "http"
bindingElement.Properties.Item("bindingInformation").Value = "192.168.0.1:80:www.contoso.com"
bindingsCollection.AddElement(bindingElement)

Set bindingElement1 = bindingsCollection.CreateNewElement("binding")
bindingElement1.Properties.Item("protocol").Value = "https"
bindingElement1.Properties.Item("bindingInformation").Value = "*:443:"
bindingsCollection.AddElement(bindingElement1)

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function