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

de Robert Lucero

Antecedentes

IIS 6 tenía una interfaz de usuario para configurar y asignar certificados uno a uno para la autenticación. Permite a los usuarios seleccionar el certificado de cliente de validación y asignar las credenciales de usuario autorizadas. No hay una 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 módulo 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 funcionalidad de autenticación mediante asignación de certificados de cliente 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>

Prerrequisitos

Estos son los requisitos previos necesarios para este tutorial. No voy a cubrir 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 (.cer archivo). [Nota: Puede ser cualquier certificado de 64 bits válido, pero debe estar en formato de archivo]
  4. Instalado un certificado de cliente en un cliente
  5. Instalación del módulo de administración de IIS 7 Technical Preview 2

Paso 1: Obtención del blob de certificado

El elemento de colección oneToOneMappings tiene un atributo denominado certificate. El valor requerido para este atributo no es lo que el certificado posee, sino el bloque real del certificado. Así es como lo extraigas.

  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 de Otros programas y haga clic en Aceptar. [Nota: El Bloc de notas puede estar oculto debajo de una lista desplegable 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. Eliminar -----BEGIN CERTIFICATE----- y -----END CERTIFICATE-----

  6. Dé 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 siguientes pasos se explica cómo habilitar la característica de autenticación mediante asignación de certificados de cliente, la asignación de certificados Uno a Uno, y cómo agregar una entrada de asignación.

  1. Iniciar 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 Acciones.
  7. Haga clic en Agregar en la lista de tareas Editor de recopilación .
  8. Copie la cadena de caracteres única de certificado anterior y péguela en el campo certificado.
  9. Establezca el nombre de usuario y la contraseña que los clientes se autenticarán como.
  10. Establezca el campo habilitado en true.
  11. Cerrar editor de recopilación
  12. Haga clic en Aplicar en el panel de tareas Acciones [Nota: Haga clic en Generación de scripts antes de hacer clic en Aplicar para obtener scripts para este proceso]

Una vez que esto esté completo, el servidor se configurará para manejar la autenticación de asignación de certificados de cliente de IIS con una única entrada de asignación de certificados de uno a uno.

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

Una vez creado un mapeo y habilitada la característica, se debe configurar un sitio para usar certificados de cliente.

  1. Desde Inetmgr, la interfaz de usuario del Administrador de IIS, seleccione el sitio web SSL que desea usar certificados de cliente.
  2. Selección del 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 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 un certificado, se responderá con un código de estado 401. Una vez instalado correctamente el certificado de cliente, la página se servirá como normal.

Juega con diferentes combinaciones de reglas de autorización para satisfacer tus necesidades.

Resumen

Ahora ha configurado mapeos de certificados de cliente de IIS y un solo mapeo de certificado de 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 de 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();
        }
    }
}