Enlace <binding>

Información general

El elemento <binding> del elemento <bindings> permite configurar la información necesaria para las solicitudes de comunicación con un sitio web.

Puede configurar la información de enlace al crear un sitio web, o bien editar la información de enlace después de crear el sitio. La información de enlace incluye el protocolo que los clientes usan para comunicarse con el sitio, la dirección IP del sitio, el número de puerto y un encabezado host.

El elemento <binding> contiene dos atributos para configurar la información de enlace: bindingInformation y protocol. El atributo bindingInformation contiene la dirección IP, el número de puerto y, opcionalmente, el encabezado host del sitio. El protocolo protocol define el protocolo que se usará para comunicarse con el sitio.

Puede configurar la colección de enlaces para un sitio mediante el Administrador de IIS si selecciona el sitio y usa los vínculos Enlaces... o Configuración avanzada... del panel Acciones, o si hace clic en Editar enlaces... en el menú contextual del sitio.

IIS 8.0 o posterior le permite proporcionar seguridad para los sitios web mediante el uso de los certificados en un almacén de certificados centralizado en Windows Server 2012. Para más información, vea Compatibilidad con certificados SSL centralizados de IIS 8.0: escalabilidad y capacidad de administración de SSL.

El elemento binding le permite especificar el tipo de enlace que se usa para los certificados de Capa de sockets seguros (SSL).

Compatibilidad

Versión Notas
IIS 10.0 El elemento <binding> no se ha modificado en IIS 10.0.
IIS 8.5 El elemento <binding> no se ha modificado en IIS 8.5.
IIS 8.0 El atributo sslFlags se agregó para especificar el enlace usado para los certificados de Capa de sockets seguros.
IIS 7.5 El elemento <binding> no se ha modificado en IIS 7.5.
IIS 7.0 El elemento <binding> de la colección <bindings> se introdujo en IIS 7.0.
IIS 6,0 La colección <bindings> reemplaza las secciones de la propiedad ServerBindings en el objeto de metabase IIsWebServer de IIS 6.0.

Configuración

El elemento <binding> se incluye en la instalación predeterminada de IIS 7 y versiones posteriores.

Procedimiento para instalar un almacén de certificados centralizado

En IIS 8 y versiones posteriores, los certificados de un almacén de certificados centralizado se pueden usar para proporcionar seguridad para un sitio web. Para usar este almacén en el servidor web de Windows Server 2012 o versiones posteriores, debe instalar el rol Almacén de certificados SSL centralizado. Para hacerlo con IIS ya instalado, continúe de la siguiente manera:

  1. Presione la tecla Windows y, después, haga clic en Administrador del servidor.
  2. En Administrador del servidor, haga clic en Administrar y después en Agregar roles y características.
  3. En el Asistente para agregar roles y características, haga clic en la página Antes de comenzar, seleccione el tipo de instalación y, después, haga clic en Siguiente en la página Tipo de instalación y seleccione dónde realizar la instalación, y haga clic en Siguiente en las páginas Selección de servidor.
  4. En la página Roles de servidor, asegúrese de que Servidor web (IIS) está seleccionado y, después, expándalo. Expanda Servidor weby, después, seleccione y expanda Seguridad.
  5. Seleccione Almacén de certificados SSL centralizadoy haga clic en Siguiente.
  6. En la página Características, haga clic en Siguiente.
  7. En la página Confirmar selecciones de instalación, haz clic en Instalar.
  8. En la página Resultados , haga clic en Cerrar.

Procedimientos

Procedimiento para agregar información de enlace a un sitio

  1. Abra el Administrador de Internet Information Services (IIS):

    • Si usa Windows Server 2012 o Windows Server 2012 R2:

      • En la barra de tareas, haga clic en Administrador del servidor, en Herramientas y, después, en Administrador de Internet Information Services (IIS).
    • Si usa Windows 8 o Windows 8.1:

      • Mantenga presionada la tecla Windows, presione la letra X y haga clic en Panel de control.
      • Haga clic en Herramientas administrativas y, después, haga doble clic en Administrador de Internet Information Services (IIS).
    • Si usa Windows Server 2008 o Windows Server 2008 R2:

      • En la barra de tareas, haga clic en Inicio, seleccione Herramientas administrativas y, después, haga clic en Administrador de Internet Information Services (IIS).
    • Si usa Windows Vista o Windows 7:

      • En la barra de tareas, haga clic en Inicio y luego en Panel de control.
      • Haga doble clic en Herramientas administrativas y después en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, expanda el nombre del servidor, luego la opción Sitios y, después, haga clic en el sitio web en el que quiera configurar el enlace.

  3. En el panel Acciones, haga clic en Enlaces....

  4. En el cuadro de diálogo Enlaces de sitios, haga clic en Agregar....
    Screenshot of the Site Bindings dialog box.

  5. En el cuadro de diálogo Agregar enlace de sitio, agregue la información de enlace y, después, haga clic en Aceptar.
    Screenshot of the Add Site Binding dialog box.

Procedimiento para crear un almacén de certificados centralizado

  1. Presione el botón Inicio y, después, haga clic en Administrador del servidor. En Administrador del servidor, haga clic en Herramientasy después en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, seleccione el nombre del servidor.
  3. En la páginaInicio, en el área Administración, haga doble clic en Certificados centralizados.
  4. En el panel Acciones, haga clic en Modificar configuración de característica.
  5. Seleccione Habilitar certificados centralizados y escriba una ruta de acceso física. Escriba un nombre de usuario y una contraseña para la ruta de acceso, y confirme la contraseña. Haga clic en OK.

Configuración

Puede agregar elementos <binding> dentro del elemento <bindings> para cada sitio en el archivo ApplicationHost.config. Cada sitio debe tener al menos un enlace HTTP o HTTPS para que se pueda ver en Internet.

Atributos

Atributo Descripción
bindingInformation Atributo de cadena necesario.

Especifica información para comunicarse con un sitio. Por ejemplo, un enlace de sitio web incluye la dirección IP (o direcciones IP no especificadas), el número de puerto y un encabezado host opcional que se usa para comunicarse con el sitio.
protocol Atributo de cadena necesario.

Especifica el protocolo para comunicarse con un sitio.
sslFlags Atributo uint opcional.

Especifica el tipo de enlace usado para los certificados de Capa de sockets seguros (SSL).
  • Un valor de "0" especifica que la conexión segura se realiza mediante una combinación de dirección IP y puerto. Solo se puede enlazar un certificado a una combinación de dirección IP y puerto.
  • Un valor de "1" especifica que la conexión segura se realiza mediante el número de puerto y el nombre de host obtenido mediante Indicación de nombre de servidor (SNI).
  • Un valor de "2" especifica que la conexión segura se realiza mediante el almacén de certificados SSL centralizado sin necesidad de un indicador de nombre de servidor.
  • Un valor de "3" especifica que la conexión segura se realiza mediante el almacén de certificados SSL centralizado y un indicador de nombre de servidor obligatorio
La compatibilidad con certificados SSL centralizados permite crear un almacén de certificados centralizados que pueda contener varios archivos de certificado. Puede asignar un nombre a los archivos de certificado que se corresponda con los nombres de host que contienen. Esto le permite crear un enlace que solo necesite un puerto, en lugar de una dirección IP y un puerto, o una combinación de nombre de host y puerto. Cuando recibe una solicitud, IIS compara el puerto, determina el nombre de host de la solicitud y busca en el almacén de certificados centralizados un archivo de certificado con un nombre coincidente. Usa ese certificado.

Con un indicador de nombre de servidor (SNI), el nombre de host se intercambia como parte del protocolo de enlace SSL. SNI se habilita en el cuadro de diálogo Agregar enlace de sitio al agregar un enlace con un tipo de HTTPS. Esto es especialmente útil para las conexiones SSL que hospedan varios servidores en una sola dirección de red. Para más información, vea Indicación de nombre de servidor (SNI) de IIS 8.0: escalabilidad de SSL.

El atributo sslFlags solo se establece cuando el protocolo es https. El valor predeterminado es 0.

Elementos secundarios

Ninguno.

Ejemplo de configuración

En el ejemplo siguiente se define un sitio denominado Contoso con dos enlaces. El primer enlace es para un nombre de host de "www.contoso.com" en el puerto 80 para la dirección IP 192.168.0.1, y el segundo es para un enlace HTTPS para todas las direcciones IP en el puerto 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>

Código de ejemplo

En los ejemplos siguientes se configura un sitio con el nombre Contoso con un nombre de host de "www.contoso.com" en el puerto 80 para la dirección IP 192.168.0.1 y un enlace HTTPS para todas las direcciones IP en el puerto 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:']

O bien, puede usar lo siguiente:

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

Nota:

Debe asegurarse de establecer el parámetrocommit en apphost cuando use AppCmd.exe para configurar estos valores. Esto confirma los valores de configuración en la sección de ubicación adecuada del archivo 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