Configuration de mappages de certificats client un-à-un

Auteur : Robert Lucero

Background

IIS 6 comprenait une interface utilisateur pour configurer et mapper des certificats un-à-un pour l’authentification. Les utilisateurs pouvaient sélectionner le certificat client de validation et attribuer les informations d’identification de l’utilisateur autorisé. Il n’existe pas d’interface utilisateur similaire dans IIS 7 et versions ultérieures. Dans cette procédure pas à pas, les utilisateurs sont invités à configurer des certificats clients un-à-un à l’aide de l’Éditeur de configuration du Pack d’administration. Les utilisateurs qui ne disposent pas de ce module complémentaire peuvent se reporter à la section Annexe où ils trouveront des arguments AppCmd et des exemples de code C# pour effectuer cette procédure pas à pas.

Schéma IIS 7 et versions ultérieures

Il s’agit du schéma de la fonctionnalité Authentification par mappage de certificat client IIS dans IIS 7 et versions ultérieures.

<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>

Prérequis

Voici les prérequis de cette procédure pas à pas. Notez que je n’explique pas comment les créer ou les mettre en place.

  1. Module de mappage de certificat client IIS installé
  2. Un site web avec une liaison HTTPS, correctement configuré
  3. Un certificat codé en base 64 (fichier .cer). [Remarque : vous pouvez utiliser n’importe quel certificat 64 bits valide, mais il doit se présenter sous forme d’un fichier.]
  4. Un certificat client installé sur un client
  5. Pack d’administration IIS 7 Technical Preview 2 installé

Étape 1 : obtention de l’objet blob de certificat

L’élément de collection oneToOneMappings possède un attribut appelé certificate. La valeur requise pour cet attribut n’est pas le certificat, mais l’objet blob du certificat. Voici comment l’extraire.

  1. Cliquez avec le bouton droit sur votre fichier .cer.

  2. Sélectionnez Ouvrir avec... dans le menu contextuel.

  3. Sélectionnez le Bloc-notes dans la liste Autres programmes, puis cliquez sur OK. [Remarque : il est possible que le Bloc-notes soit masqué sous une liste déroulante dans le mode Liste Vista/Windows 2008.]

  4. Voici le contenu que vous devriez voir dans le Bloc-notes :

    -----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. Supprimez-----BEGIN CERTIFICATE----- et -----END CERTIFICATE----.

  6. Mettez en forme l’objet blob de certificat sur une seule ligne.

  7. Enregistrez ce fichier sous clientCertBlob.txt.

Étape 2 : activation de l’authentification par mappage de certificat client IIS et du mappage de certificat un-à-un pour un site web

Les étapes suivantes expliquent comment activer la fonctionnalité d’authentification par mappage de certificat client, activer le mappage de certificat un-à-un et ajouter une entrée de mappage.

  1. Démarrez Inetmgr, l’interface utilisateur du Gestionnaire IIS.
  2. Sélectionnez le site web SSL en cours de configuration et ouvrez l’Éditeur de configuration.
  3. Tapez « system.webServer/security/authentication/iisClientCertificateMappingAuthentication » dans la liste déroulante Section.
  4. Sélectionnez le champ enabled et remplacez la valeur par true.
  5. Sélectionnez l’entrée de grille de propriétés oneToOneCertificateMappingsEnabled, puis remplacez la valeur par true.
  6. Sélectionnez l’entrée de grille de propriétés oneToOneMappings, puis cliquez sur Modifier les éléments... dans le volet des tâches Actions.
  7. Cliquez sur Ajouter dans la liste des tâches de l’Éditeur de collections.
  8. Copiez l’objet blob de certificat à chaîne unique ci-dessus et collez-le dans le champ certificate.
  9. Définissez le nom d’utilisateur (userName) et le mot de passe (password) avec lesquels les clients seront authentifiés.
  10. Définissez le champ enabled sur true.
  11. Fermez l’Éditeur de collections.
  12. Cliquez sur Appliquer dans le volet des tâches Actions. [Remarque : cliquez sur Génération de script avant de cliquer sur Appliquer pour obtenir des scripts pour ce processus.]

Une fois cette procédure terminée, le serveur est configuré pour gérer l’authentification par mappage de certificat client IIS avec une seule entrée de mappage de certificat un-à-un.

Étape 3 : activation de l’authentification par certificat client pour un site web avec SSL

Après avoir créé un mappage et activé la fonctionnalité, vous devez configurer un site pour utiliser des certificats clients.

  1. Dans Inetmgr, l’interface utilisateur du Gestionnaire IIS, sélectionnez le site web SSL pour lequel vous souhaitez utiliser des certificats clients.
  2. Sélectionnez le module d’interface utilisateur SSL.
  3. Sous Certificats clients sélectionnez la case d’option Accepter.
  4. Cliquez sur Appliquer dans le volet des tâches Actions.

Le site web est maintenant configuré pour accepter et authentifier les clients en fonction de certificats clients.

Étape 4 : vérification du bon fonctionnement de l’ensemble

Le client qui tente d’accéder à la page web SSL doit avoir correctement installé le certificat client. Si un client tente de demander une page sans le certificat, une erreur 401 est générée. Une fois le certificat client correctement installé, la page s’affiche normalement.

Essayez différentes combinaisons de règles d’autorisation pour répondre à vos besoins.

Résumé

Vous venez de configurer des mappages de certificats clients IIS et un mappage de certificat un-à-un.

Annexe

Ces extraits de code permettent d’effectuer les étapes 2 et 3 de la procédure pas à pas. Tout ceci a été généré à l’aide de la fonctionnalité Génération de script de l’Éditeur de configuration.

Instructions propres à 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

Code 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();
        }
    }
}