設定一對一用戶端憑證對應

作者 :Robert Lucero

背景

IIS 6 具有使用者介面,可設定一個憑證並對應至一個憑證以進行驗證。 它允許使用者選取驗證用戶端憑證,並指派授權的使用者認證。 IIS 7 和更新版本中沒有類似的 UI。 本逐步解說旨在指示使用者使用系統管理元件的組態編輯器設定一對一用戶端憑證。 沒有此附加元件的使用者可以檢視 AppCmd 引數和 C# 程式碼範例的附錄一節,以執行本逐步解說。

IIS 7 和更新版本架構

這是 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 系統管理元件 Technical Preview 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. 設定用戶端將驗證為的 userName密碼
  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# 程式碼:

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