配置一对一客户端证书映射

作者:Robert Lucero

背景

IIS 6 具有一个用户界面,用于配置和映射到用于身份验证的一对一证书。 它允许用户选择验证客户端证书,并分配授权的用户凭据。 IIS 7 及更高版本中没有类似的 UI。 本演练旨在指示用户使用管理包的配置编辑器配置一对一客户端证书。 没有此加载项的用户可以查看 AppCmd 参数和 C# 代码示例的附录部分来执行本演练。

IIS 7.0 及更高版本的架构

这是 IIS 7 及更高版本中 IIS 客户端证书映射身份验证功能的架构。

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

先决条件

这些是此演练的先决条件。 我不会介绍如何创建或执行这些事情。

  1. 安装的 IIS 客户端证书映射模块
  2. 具有 HTTPS 绑定的网站,已正确配置
  3. Base-64 证书(.cer 文件)。 [注意:这可以是任何有效的 64 位证书,但必须采用文件格式]
  4. 在客户端上安装客户端证书
  5. 安装 IIS 7 管理包技术预览版 2

步骤 1:获取证书 Blob

oneToOneMappings 集合项具有一个名为证书的属性。 此属性的必需值不是证书的值,而是实际的证书 blob。 下面介绍了如何提取它。

  1. 右键单击解决 .cer 文件。

  2. 在上下文菜单中选择“打开方式”

  3. 从“其他程序”列表中选择“记事本”,然后单击“确定”。 [注意:记事本可能隐藏在 Vista/Windows 2008 列表视图中的下拉列表下方]

  4. 这是应该在记事本中显示的内容:

    -----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. 删除 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----

  6. 将证书 blob 的格式设置为单行。

  7. 将此文件另存为 clientCertBlob.txt

步骤 2:为网站启用 IIS 客户端证书映射身份验证和一对一证书映射

后续步骤将介绍如何启用客户端证书映射身份验证功能、一对一证书映射和添加映射条目。

  1. 启动 Inetmgr,IIS 管理器 UI
  2. 选择要配置的 SSL 网站,并打开配置编辑器
  3. 在“部分”下拉框中,输入“system.webServer/security/authentication/iisClientCertificateMappingAuthentication”。
  4. 选择“已启用”字段,并将值更改为 true
  5. 选择 oneToOneCertificateMappingsEnabled 属性网格条目,并将值更改为 true
  6. 选择 oneToOneMappings 属性网格条目,然后单击“操作”任务窗格中的“编辑项”
  7. 在“集合编辑器”任务列表中单击“添加”
  8. 从上面复制单个字符串证书 blob,并将其粘贴到“证书”字段中
  9. 设置客户端将进行身份验证的用户名和密码
  10. 将“已启用”字段设置为 true
  11. 关闭集合编辑器
  12. 在“操作”任务窗格中单击“应用”[注意:单击“脚本生成”,然后单击“应用”以获取此过程的脚本]

完成此操作后,服务器将配置为使用单个一对一证书映射条目来处理 IIS 客户端证书映射身份验证。

步骤 3:使用 SSL 为网站启用客户端证书身份验证

创建映射并启用该功能后,必须将站点配置为使用客户端证书。

  1. 在 Inetmgr - IIS 管理器 UI 中,选择要使用客户端证书的 SSL 网站
  2. 选择 SSL UI 模块
  3. 在“客户端证书”下:选择“接受”选项按钮
  4. 在“操作”任务窗格中,单击“应用”

现在,网站配置为根据客户端证书接受和验证客户端。

步骤 4:验证一切有效运行

尝试访问 SSL 网页的客户端需要正确安装客户端证书。 如果客户端尝试请求没有证书的页面,则会提供 401。 正确安装客户端证书后,页面将正常使用。

使用不同的授权规则组合来满足你的需求。

总结

现已配置 IIS 客户端证书映射和单个一对一证书映射。

附录

这些是用于执行演练步骤 2 和步骤 3 的代码片段。 所有这些操作都是使用配置编辑器的脚本生成生成的。

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