Configuración de asignaciones de certificados de cliente uno a uno

por Robert Lucero

Fondo

IIS 6 tenía una interfaz de usuario para configurar y asignar uno a uno los certificados de autenticación. Permitía a los usuarios seleccionar el certificado de cliente de validación y asignar las credenciales de usuario autorizado. No hay ninguna interfaz de usuario similar en IIS 7 y versiones posteriores. Este tutorial está diseñado para indicar a los usuarios que configuren uno a uno de los certificados de cliente mediante el Editor de configuración del paquete de administración. Los usuarios que no tienen este complemento pueden ver la sección apéndice de argumentos de AppCmd y ejemplos de código de C# para realizar este tutorial.

Esquema IIS 7 y versiones posteriores

Este es el esquema de la característica de autenticación de asignación de certificados de cliente de IIS en IIS 7 y versiones posteriores.

<sectionSchema name="system.webServer/security/authentication/iisClientCertificateMappingAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="oneToOneCertificateMappingsEnabled" type="bool" defaultValue="true" />
  <element name="oneToOneMappings">
    <collection addElement="add" clearElement="clear">
      <attribute name="enabled" type="bool" defaultValue="true" />
      <attribute name="userName" type="string" />
      <attribute name="password" type="string" encrypted="true" />
      <attribute name="certificate" type="string" required="true" isUniqueKey="true" />
    </collection>
  </element>
</sectionSchema>

Requisitos previos

Estos son los requisitos previos necesarios para este tutorial. No se hablará de cómo crear o hacer estas cosas.

  1. Módulo de asignación de certificados de cliente de IIS instalado
  2. Un sitio web con un enlace HTTPS, configurado correctamente
  3. Un certificado Base-64 (archivo .cer). [Nota: Puede ser cualquier certificado de 64 bits válido, pero debe estar en formato de archivo]
  4. Un certificado de cliente instalado en un cliente
  5. Instalación de la Versión preliminar técnica 2 del Paquete de administración IIS 7

Paso 1: Obtener el blob de certificados

El elemento de colección oneToOneMappings tiene un atributo denominado certificado. El valor necesario para este atributo no es el certificado, sino el blob de certificado real. Así es como se extrae.

  1. Haga clic con el botón derecho en el archivo .cer.

  2. Seleccione Abrir con... en el menú contextual

  3. Seleccione Bloc de notas en la lista Otros programas y haga clic en Aceptar. [Nota: El Bloc de notas puede estar oculto debajo de una lista desplegable en la vista de lista de Vista/Windows 2008]

  4. Esto es lo que debe mostrarse en el Bloc de notas:

    -----BEGIN CERTIFICATE----- 
    MIIEfjCCA2agAwIBAgIKFW1IXAAAAAAAAjANBgkqhkiG9w0BAQUFADAbMRkwFwYD 
    VQQDExBJSVNSZW1vdGVNZ3JUZXN0MB4XDTA4MDIxMTIxNTk1NloXDTA5MDIxMTIy 
    MDk1NlowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV 
    BAcTB1JlZG1vbmQxDTALBgNVBAoTBE1TRlQxDDAKBgNVBAsTA0lJUzEVMBMGA1UE 
    AxMMUkxVQ0VSTzItSUlTMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3611j 
    34q2qQgHa7ao11TcQMDYlJMrqET05MWFY1/Vso+leujLoIGTfdHOuz4IBVoeUE+y 
    mlL8r53s2BQeVFROnDtg4Jko1zJsz7AUAnQNBk/GYA1AHYmhY79Z0p1KXW/wSTJB 
    tdUn732GQOqYf4wY8jOD2zUJDUG4HXm6ib8ajwIDAQABo4IB+TCCAfUwDgYDVR0P 
    AQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMBMHgGCSqGSIb3DQEJDwRrMGkw 
    DgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJ 
    YIZIAWUDBAEtMAsGCWCGSAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYI 
    KoZIhvcNAwcwHQYDVR0OBBYEFHbHA+HwZcIrslklj1W3O23UFrBgMB8GA1UdIwQY 
    MBaAFMxzlGbmkp2+phhDg7TPfi83d7UVMHMGA1UdHwRsMGowaKBmoGSGL2h0dHA6 
    Ly9paXNzYjMwNS9DZXJ0RW5yb2xsL0lJU1JlbW90ZU1nclRlc3QuY3JshjFmaWxl 
    Oi8vXFxpaXNzYjMwNVxDZXJ0RW5yb2xsXElJU1JlbW90ZU1nclRlc3QuY3JsMIGe 
    BggrBgEFBQcBAQSBkTCBjjBEBggrBgEFBQcwAoY4aHR0cDovL2lpc3NiMzA1L0Nl 
    cnRFbnJvbGwvaWlzc2IzMDVfSUlTUmVtb3RlTWdyVGVzdC5jcnQwRgYIKwYBBQUH 
    MAKGOmZpbGU6Ly9cXGlpc3NiMzA1XENlcnRFbnJvbGxcaWlzc2IzMDVfSUlTUmVt 
    b3RlTWdyVGVzdC5jcnQwDQYJKoZIhvcNAQEFBQADggEBAEsSkcx0re36IL80UphJ 
    w/srR3LBsy8sfwqxBMzMTdF7k6jYtUVpn3D2Dd4JXXVOaEVud9YNn9pr6xJL4t79 
    Zh+hJzIPA5pQLbccx4vjWB4cWEYxzcoKYCuUdZrfPFXO1a5kQAj8IZ0/6bhMceyR 
    Z7dRDoaIuAGQLFAlC/KjIBCemDi54MlWtvATQ8bmiRuEOWeneK2Vd2e0fxyezk05 
    dRqa8DEC74CQN4rQuz395ECm+M/hQnN+dHOygV8n9swd0bdNq8qypwfVUes5HIpj 
    LFmKTuGyFSVj7jv+64oTxvxtYX2QFp9q6Bi+qj0uyrX8Xjxy5rPSVPEfnxPCBg58 
    RCI= 
    -----END CERTIFICATE-----
    
  5. Quite -----BEGIN CERTIFICATE----- y -----END CERTIFICATE----

  6. Aplique formato al blob de certificado para que sea una sola línea.

  7. Guarde este archivo como clientCertBlob.txt

Paso 2: Habilitar la autenticación de asignación de certificados de cliente de IIS y la asignación de certificados uno a uno para un sitio web

En los pasos siguientes se explica cómo habilitar la característica de autenticación de asignación de certificados de cliente, cómo asignar certificados uno a uno y cómo agregar una entrada de asignación.

  1. Inicie Inetmgr, la interfaz de usuario del Administrador de IIS
  2. Seleccione el sitio web SSL que se está configurando y abra el Editor de configuración
  3. Escriba system.webServer/security/authentication/iisClientCertificateMappingAuthentication en el cuadro desplegable Sección.
  4. Seleccione el campo habilitado y cambie el valor a true
  5. Seleccione la entrada de cuadrícula de propiedades oneToOneCertificateMappingsEnabled y cambie el valor a true
  6. Seleccione la entrada de cuadrícula de propiedades oneToOneMappings y haga clic en Editar elementos... en el panel de tareas de Acciones
  7. Haga clic en Agregar en la lista de tareas del Editor de colección
  8. Copie el blob de certificado de cadena única anterior y péguelo en el campo certificado
  9. Establezca el nombre de usuario y la contraseña con los cuales se autenticarán los clientes.
  10. Establezca el campo habilitado en true
  11. Cierre el Editor de colecciones
  12. Haga clic en Aplicar en el panel de tareas de Acciones [Nota: Haga clic en Generación de scripts antes de hacer clic en Aplicar para obtener scripts para este proceso]

Una vez completado, el servidor se configurará para controlar la autenticación de asignación de certificados de cliente de IIS con una sola entrada de asignación de certificados uno a uno.

Paso 3: Habilitar la autenticación de certificados de cliente para un sitio web mediante SSL

Una vez creada una asignación y habilitada la característica, se debe configurar un sitio para que use los certificados de cliente.

  1. Desde Inetmgr, la interfaz de usuario del Administrador de IIS, seleccione el sitio web de SSL para el que desea usar los certificados de cliente
  2. Seleccione el módulo de interfaz de usuario SSL
  3. En Certificados de cliente: seleccione el botón de radio Aceptar
  4. Haga clic en Aplicar en el panel de tareas de Acciones

Ahora el sitio web está configurado para aceptar y autenticar clientes en función de los certificados de cliente.

Paso 4: Comprobar que todo funciona

El cliente que intenta acceder a la página web SSL necesita que el certificado de cliente esté instalado correctamente. Si un cliente intenta solicitar una página sin el certificado se atenderá a 401. Una vez instalado correctamente el certificado de cliente, la página se servirá como normal.

Juegue con diferentes combinaciones de reglas de autorización para satisfacer sus necesidades.

Resumen

Ahora ha configurado asignaciones de certificados de cliente de IIS y una sola asignación de certificados uno a uno.

Apéndice

Estos son los fragmentos de código para realizar los pasos 2 y 3 del tutorial. Todo esto se generó mediante la generación de scripts del Editor de configuración.

Instrucciones específicas de AppCmd

appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication 
    /enabled:"True" /oneToOneCertificateMappingsEnabled:"True"  /commit:apphost

appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication 
    /+"oneToOneMappings.[userName='testUser',password='securePassWord!1',certificate='CERTIFICATE_BLOB']" /commit:apphost

appcmd.exe set config "Default Web Site" -section:system.webServer/security/access /sslFlags:"Ssl, SslNegotiateCert, Ssl128"  /commit:apphost

Código 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 iisClientCertificateMappingAuthenticationSection = 
                    config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site");
            iisClientCertificateMappingAuthenticationSection["enabled"] = true;
            iisClientCertificateMappingAuthenticationSection["oneToOneCertificateMappingsEnabled"] = true;
            
            ConfigurationElementCollection oneToOneMappingsCollection = 
                     iisClientCertificateMappingAuthenticationSection.GetCollection("oneToOneMappings");
            
            ConfigurationElement addElement = oneToOneMappingsCollection.CreateElement("add");
            addElement["userName"] = @"testUser";
            addElement["password"] = @"securePassWord!1";
            addElement["certificate"] = @"CERTIFICATE_BLOB";
            oneToOneMappingsCollection.Add(addElement);
            
            serverManager.CommitChanges();
        }
    }
}

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 accessSection = config.GetSection("system.webServer/security/access", "Default Web Site");
            accessSection["sslFlags"] = @"Ssl, SslNegotiateCert, Ssl128";
            
            serverManager.CommitChanges();
        }
    }
}