Configuración de asignaciones de certificados de cliente de varios a uno para IIS 7.0 y 7.5

En este artículo se presenta cómo usar la característica Editor de configuración en Microsoft Internet Information Services (IIS) para configurar asignaciones de certificados de cliente de varios a uno.

Versión del producto original:   Internet Information Services 7.0, 7.5
Número KB original:   2026113

Introducción

IIS usa la asignación de certificados de cliente de varios a uno para asociar un usuario final a una cuenta de Windows cuando se usa el certificado de cliente para la autenticación de usuario. IIS ejecuta la sesión del usuario en el contexto de esta cuenta Windows asignada. Para funcionar como se esperaba, debe asegurarse de que la asignación de certificado a cuenta esté configurada correctamente en IIS.

En IIS 6.0, los usuarios tenían la opción de configurar la asignación de certificados de cliente de varios a uno a través de la interfaz de usuario del Administrador de IIS. En IIS 7.0 y 7.5, esa interfaz no existe para las asignaciones de uno a uno o de varios a uno. En este artículo se explica cómo usar la característica Editor de configuración de IIS para configurar asignaciones de certificados de cliente de varios a uno.

Nota

Para obtener información sobre cómo usar el Editor de configuración para configurar asignaciones de certificados de cliente de uno a uno, vea Configuring One-to-One Client Certificate Mappings.

Esquema de IIS 7.0/7.5

Este es el esquema de la característica de autenticación de asignación de certificados de cliente de IIS en IIS 7.0 e IIS 7.5:

<sectionSchema name="system.webServer/security/authentication/iisClientCertificateMappingAuthentication">
   <attribute name="enabled" type="bool" defaultValue="false" />
   <attribute name="manyToOneCertificateMappingsEnabled" type="bool" defaultValue="true" />
   ...
   <element name="manyToOneMappings">
     <collection addElement="add" clearElement="clear">
       <attribute name="name" type="string" required="true" isUniqueKey="true"
       validationType="nonEmptyString" />
       <attribute name="description" type="string" />
       <attribute name="enabled" type="bool" defaultValue="true"/>
       <attribute name="permissionMode" type="enum" defaultValue="Allow">
         <enum name="Allow" value="1"/>
         <enum name="Deny" value="2" />
       </attribute>
       <element name="rules">
         <collection addElement="add" clearElement="clear">
           <attribute name="certificateField" type="enum" required="true" isCombinedKey="true">
             <enum name="Subject" value="1" />
             <enum name="Issuer" value="2" />
           </attribute>
           <attribute name="certificateSubField" type="string" caseSensitive="true"
           required="true" isCombinedKey="true" />
           <attribute name="matchCriteria" type="string" caseSensitive="true"
           required="true" isCombinedKey="true" />
           <attribute name="compareCaseSensitive" type="bool" isCombinedKey="true" defaultValue="true" />
         </collection>
       </element>
       <attribute name="userName" type="string" validationType="nonEmptyString" />
       <attribute name="password" type="string" caseSensitive="true" encrypted="true"
       defaultValue="[enc:AesProvider::enc]" />
     </collection>
   </element>
   ...
</sectionSchema>

Requisitos previos

Estos son los requisitos previos necesarios para este recorrido:

  1. Ha instalado el módulo de asignación de certificados de cliente de IIS en el servidor IIS.

  2. Un sitio web está configurado con un enlace de protocolo de transferencia de hipertexto seguro (HTTPS) que puede aceptar conexiones de capa de sockets seguros (SSL).

  3. Tiene un certificado de cliente instalado en el cliente.

  4. El módulo de administración de IIS 7 está instalado en el servidor de IIS 7.0.

    Nota

    El Editor de configuración se envía de forma predeterminada en IIS 7.5.

Configurar la asignación de certificados por el Editor de configuración

  1. Inicie el administrador de IIS y seleccione el sitio web que se configurará para la autenticación de certificados de cliente.

  2. En la vista Características, seleccione Editor de configuración en la sección Administración.

    Seleccione el Editor de configuración en Administración en la vista Características.

  3. Vaya al system.webServer/security/authentication/iisClientCertificateMappingAuthentication cuadro desplegable como se muestra a continuación:

    Seleccione iisClientCertificateMappingAuthentication en autenticación.

    Verá una ventana para configurar asignaciones de certificados de varios a uno o de uno a uno aquí. Esta es la interfaz de usuario proporcionada a través del Editor de configuración desde donde puedes configurar todas las configuraciones de asignación.

    Captura de pantalla de la ventana que se usa para configurar todas las configuraciones de asignación.

  4. Modifique las propiedades a través de esta interfaz gráfica de usuario (GUI).

    • Establecer habilitado en True.
    • Establezca manyToOneCertificateMappingsEnabled en True.
    • Seleccione manyToOneMappings y seleccione en el botón de puntos suspensivos para iniciar una nueva ventana para configurar asignaciones.
  5. En esta nueva ventana, seleccione para agregar un nuevo elemento. Puede modificar las propiedades desde dentro de la ventana como se muestra a continuación:

    Captura de pantalla de la ventana que se usa para modificar las propiedades de un nuevo elemento.

  6. Seleccione en el botón de puntos suspensivos para las reglas, lo que le dará la opción de agregar varios patrones para la coincidencia en función de las propiedades del certificado.

    Captura de pantalla 1 para agregar varios patrones.

    Captura de pantalla 2 para agregar varios patrones.

    Captura de pantalla 3 para agregar varios patrones.

En estas imágenes de ejemplo, hay dos entradas para las reglas para asignar el certificado.

En primer lugar, están los campos Asunto y Emisor en el certificado. En segundo lugar, está la propiedad matchcriteria para asignar el certificado a la cuenta mydomain\testuser.

En la imagen siguiente, se muestra la asignación final de una cuenta de Windows específica. Como puede ver, hay dos entradas para las reglas de esta cuenta.

Captura de pantalla de un elemento que tiene dos entradas para reglas.

Del mismo modo, puede tener otras asignaciones para las cuentas basadas en los campos Emisor y Asunto en el certificado.

Configurar la asignación de certificados APPCMD.exe

Hasta ahora, lo que se ha ilustrado se logra con el Editor de configuración, que proporciona una interfaz gráfica para establecer fácilmente la configuración. Puede lograr lo mismo con comandos y, de hecho, el Editor de configuración hace lo mismo en segundo plano y agrega esta configuración al APPCMD.exe ApplicationHost.config archivo.

El Editor de configuración también te ofrece una opción para ejecutar estos comandos manualmente y genera los scripts para lograrlo desde dentro de la propia interfaz de usuario:

Seleccione la opción Generar script para ejecutar comandos.

Ejecute comandos manualmente en la ventana Diálogo de script.

Estos son los fragmentos de código para realizar los mismos pasos anteriores para configurar la asignación de certificados. Se generaron mediante la característica generación de scripts del Editor de configuración.

Comandos de AppCmd

appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication /enabled:"True" /manyToOneCertificateMappingsEnabled:"True"  /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication /+"manyToOneMappings.[name='My 1st  Mapping',description='1st User Mapping',userName='mydomain\testuser',password='abcdef']" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication /+"manyToOneMappings.[name='My 1st  Mapping',description='1st User Mapping',userName='mydomain\testuser',password='abcdef'].rules.[certificateField='Subject',certificateSubField='CN',matchCriteria='Test User']" /commit:apphost

C# código

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 iisClientCertificateMappingAuthenticationSection =
            config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site");
            iisClientCertificateMappingAuthenticationSection["enabled"] = true;
            iisClientCertificateMappingAuthenticationSection["manyToOneCertificateMappingsEnabled"] = true;
            ConfigurationElementCollection manyToOneMappingsCollection = iisClientCertificateMappingAuthenticationSection.GetCollection("manyToOneMappings");
            ConfigurationElement addElement = manyToOneMappingsCollection.CreateElement("add");
            addElement["name"] = @"My 1st  Mapping";
            addElement["description"] = @"1st User Mapping";
            addElement["userName"] = @"mydomain\testuser";
            addElement["password"] = @"abcdef";
            ConfigurationElementCollection rulesCollection = addElement.GetCollection("rules");
            ConfigurationElement addElement1 = rulesCollection.CreateElement("add");
            addElement1["certificateField"] = @"Subject";
            addElement1["certificateSubField"] = @"CN";
            addElement1["matchCriteria"] = @"Test User";
            rulesCollection.Add(addElement1);
            manyToOneMappingsCollection.Add(addElement);
            serverManager.CommitChanges();
        }
    }
}

Scripting (JavaScript)

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var iisClientCertificateMappingAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "MACHINE/WEBROOT/APPHOST/Default Web Site");
iisClientCertificateMappingAuthenticationSection.Properties.Item("enabled").Value = true;
iisClientCertificateMappingAuthenticationSection.Properties.Item("manyToOneCertificateMappingsEnabled").Value = true;
var manyToOneMappingsCollection = iisClientCertificateMappingAuthenticationSection.ChildElements.Item("manyToOneMappings").Collection;
var addElement = manyToOneMappingsCollection.CreateNewElement("add");
addElement.Properties.Item("name").Value = "My 1st  Mapping";
addElement.Properties.Item("description").Value = "1st User Mapping";
addElement.Properties.Item("userName").Value = "mydomain\\testuser";
addElement.Properties.Item("password").Value = "abcdef";
var rulesCollection = addElement.ChildElements.Item("rules").Collection;
var addElement1 = rulesCollection.CreateNewElement("add");
addElement1.Properties.Item("certificateField").Value = "Subject";
addElement1.Properties.Item("certificateSubField").Value = "CN";
addElement1.Properties.Item("matchCriteria").Value = "Test User";
rulesCollection.AddElement(addElement1);
manyToOneMappingsCollection.AddElement(addElement);
adminManager.CommitChanges();