Konfigurieren von Eins-zu-Eins-Zertifikatszuordnungen für Clients

von Robert Lucero

Hintergrund

IIS 6 verfügte über eine Benutzeroberfläche zum Konfigurieren und Zuordnen von Eins-zu-Eins-Zertifikaten für die Authentifizierung. Benutzer können das Überprüfungsclientzertifikat auswählen und die autorisierten Benutzeranmeldeinformationen zuweisen. In IIS 7 und höher gibt es keine ähnliche Benutzeroberfläche. Diese exemplarische Vorgehensweise wurde entwickelt, um Benutzer anzuweisen, Eins-zu-Eins-Clientzertifikat mithilfe des Konfigurations-Editors von Administration Pack zu konfigurieren. Benutzer, die nicht über dieses Add-On verfügen, können den Anhangsabschnitt für AppCmd-Argumente und C#-Codebeispiele anzeigen, um diese exemplarische Vorgehensweise auszuführen.

Schema für IIS 7 und höher

Dies ist das Schema für das Feature „Authentifizierung durch IIS-Clientzertifikatszuordnung“ in IIS 7 und höher.

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

Voraussetzungen

Dies sind die Voraussetzungen für diese exemplarische Vorgehensweise. Ich werde nicht behandeln, wie man diese Dinge erstellt oder macht.

  1. Installiertes Modul für die IIS-Clientzertifikatszuordnung
  2. Eine Website mit einer HTTPS-Bindung, ordnungsgemäß konfiguriert
  3. Ein Base-64-Zertifikat (.cer-Datei). [Hinweis: Dies kann ein beliebiges gültiges 64-Bit-Zertifikat sein. Es muss jedoch in Dateiformularen vorhanden sein.]
  4. Installiertes Clientzertifikat auf einem Client
  5. Installation von IIS 7 Administration Pack Technical Preview 2

Schritt 1: Abrufen des Zertifikatblobs

Das OneToOneMappings-Auflistungselement weist ein Attribut namens „Certificate“ auf. Der erforderliche Wert für dieses Attribut ist nicht das Zertifikat, sondern das tatsächliche Zertifikatblob. So extrahieren Sie es.

  1. Klicken Sie mit der rechten Maustaste auf Ihre .cer-Datei.

  2. Wählen Sie Öffnen mit... im Kontextmenü aus.

  3. Wählen Sie „Editor“ aus der Liste „Andere Programme“ aus, und klicken Sie auf „OK“. [Hinweis: Editor kann unter einer Dropdownliste in der Vista/Windows 2008-Listenansicht ausgeblendet werden.]

  4. Folgendes sollte im Editor angezeigt werden:

    -----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. Entfernen Sie -----BEGIN CERTIFICATE----- und -----END CERTIFICATE----

  6. Formatieren Sie das Zertifikatblob als eine einzelne Zeile.

  7. Speichern Sie diese Datei als „clientCertBlob.txt“.

Schritt 2: Aktivieren der Authentifizierung für die Zuordnung von IIS-Clientzertifikaten und einer zu einer Zertifikatszuordnung für eine Website

In den nächsten Schritten wird erläutert, wie Sie das Feature „Authentifizierung durch Clientzertifikatzuordnung“ und „Eins-zu-Eins-Zertifikatzuordnung“ aktivieren und einen Zuordnungseintrag hinzugefügen.

  1. Starten Sie Inetmgr, die IIS-Manager-Benutzeroberfläche.
  2. Wählen Sie die SSL-Website aus, die konfiguriert wird, und öffnen Sie den Konfigurations-Editor.
  3. Geben Sie „system.webServer/security/authentication/iisClientCertificateMappingAuthentication“ in das Dropdownfeld Abschnitt ein.
  4. Wählen Sie das aktivierte Feld aus, und ändern Sie den Wert in wahr.
  5. Wählen Sie den Eigenschaftsrastereintrag OneToOneCertificateMappingsEnabled aus, und ändern Sie den Wert in wahr.
  6. Wählen Sie den Eigenschaftsrastereintrag OneToOneMappings aus, und klicken Sie im Aufgabenbereich „Aktionen“ auf Elemente bearbeiten....
  7. Klicken Sie in der Aufgabenliste des Auflistungs-Editors auf Hinzufügen.
  8. Kopieren Sie den Blob für ein einzelnes Zeichenfolgenzertifikat von oben, und fügen Sie ihn in das Zertifikatfeld ein.
  9. Legen Sie den userName und das Kennwort fest, unter dem Clients authentifiziert werden.
  10. Legen Sie das aktivierte Feld auf wahr fest.
  11. Schließen Sie den Auflistungs-Editor.
  12. Klicken Sie im Aufgabenbereich „Aktionen“ auf Anwenden [Hinweis: Klicken Sie auf Skriptgenerierung bevor Sie auf Anwenden klicken, um Skripts für diesen Prozess abzurufen].

Sobald dies abgeschlossen ist, wird der Server so konfiguriert, dass die Authentifizierung durch IIS-Clientzertifikatszuordnung mit einem einzelnen Eins-zu-Eins-Zertifikatzuordnungseintrag verarbeitet wird.

Schritt 3: Aktivieren der Clientzertifikatauthentifizierung für eine Website mithilfe von SSL

Nachdem eine Zuordnung erstellt und das Feature aktiviert wurde, muss eine Website für die Verwendung von Clientzertifikaten konfiguriert werden.

  1. Wählen Sie in Inetmgr, der IIS-Manager-Benutzeroberfläche, die SSL-Website aus, für die Sie Clientzertifikate verwenden möchten.
  2. Wählen Sie das SSL-Benutzeroberflächenmodul aus.
  3. Wählen Sie unter Clientzertifikate: das Optionsfeld Annehmen aus.
  4. Klicken Sie im Aufgabenbereich „Aktionen“ auf Anwenden.

Jetzt ist die Website so konfiguriert, dass Clients basierend auf Clientzertifikaten akzeptiert und authentifiziert werden.

Schritt 4: Überprüfen, ob alles funktioniert

Für den Client, der versucht, auf die SSL-Webseite zuzugreifen, muss das Clientzertifikat ordnungsgemäß installiert sein. Wenn ein Client versucht, eine Seite ohne das Zertifikat anzufordern, wird ein 401-Fehler angezeigt. Sobald das Clientzertifikat ordnungsgemäß installiert ist, wird die Seite normal bereitgestellt.

Probieren Sie verschiedene Kombinationen von Autorisierungsregeln nach Ihren Anforderungen aus.

Zusammenfassung

Sie haben jetzt IIS-Clientzertifikatszuordnungen und eine einzelne Eins-zu-Eins-Zertifikatszuordnung konfiguriert.

Anhang

Dies sind die Codeausschnitte zum Ausführen der exemplarischen Vorgehensweisen in den Schritten 2 und 3. All dies wurde mithilfe der Skriptgenerierung des Konfigurations-Editors generiert.

AppCmd-spezifische Anweisungen

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#-Code:

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