您目前已離線,請等候您的網際網路重新連線

不支援您的瀏覽器

您必須更新瀏覽器,才能使用此網站。

更新至最新版本的 Internet Explorer

如何在 ASP.NET Web 應用程式中使用用戶端憑證呼叫 Web 服務進行驗證

結論
本文將討論如何從 ASP.NET Web 應用程式,將用戶端憑證傳遞至 Web 服務進行驗證。

注意 本文中的步驟也適用於使用 HttpWebRequest 類別,提出直接 HTTP 要求時 (如果不叫用 Web 服務)。
簡介
Web 服務經常必須驗證呼叫 Web 服務的應用程式。在 Web 服務執行授權之前,必須執行呼叫應用程式的驗證,而其中一個驗證技術是要求呼叫 Web 服務的應用程式提供用戶端憑證。

當 ASP.NET Web 應用程式嘗試呼叫使用憑證進行驗證的 Web 服務時,可能會收到「拒絕存取」的錯誤訊息。但是當主控台應用程式或 Microsoft Windows Form 應用程式呼叫相同的 Web 服務時,則不會收到錯誤訊息。

這是因為電腦會維護兩種不同的憑證存放區,所以發生這種情況。
  • 本機電腦存放區:ASP.NET Web 應用程式會檢查這個存放區以尋找用戶端憑證。
  • 本機使用者存放區:互動式使用者應用程式會檢查這個存放區以尋找用戶端憑證。
一般來說,當互動式使用者應用程式安裝用戶端憑證時,用戶端憑證會安裝在本機使用者存放區中。因此,互動式使用者應用程式就能夠使用用戶端憑證。然而,ASP.NET Web 應用程式就無法使用用戶端憑證。
其他相關資訊
如果要讓 ASP.NET Web 應用程式能夠使用用戶端憑證,您必須將用戶端憑證安裝在本機電腦存放區中。當您在本機電腦存放區中安裝用戶端憑證時,只有「系統管理員」群組中的使用者帳戶,以及安裝用戶端憑證的使用者能夠使用用戶端憑證。因此,您必須將用戶端憑證的存取權限,授予用來執行 ASP.NET Web 應用程式的使用者帳戶。

注意 您必須安裝 Microsoft .NET Framework 1.1 Service Pack 1 (SP1) 才能使用本機電腦存放區中的用戶端憑證。

此外,當 ASP.NET Web 應用程式呼叫 Web 服務時,應用程式必須從憑證存放區中匯出用戶端憑證,然後將用戶端憑證新增至 Web 服務呼叫。

安裝用戶端憑證並授予使用者帳戶存取權限

如果要安裝用戶端憑證,並且將用戶端憑證的存取權授予用來執行 ASP.NET Web 應用程式的使用者帳戶,請依照下列步驟執行。

步驟 1:在本機電腦存放區中安裝用戶端憑證

如果 PKCS#12 (.pfx) 格式的檔案含有用戶端憑證,您便能使用 Microsoft Windows HTTP Services Certificate Configuration Tool (WinHttpCertCfg.exe) 安裝用戶端憑證,並且將用戶端憑證的存取權限授予其他使用者帳戶,例如 Network Service 帳戶。如果要執行這項操作,請依照下列步驟執行:
  1. 下載並安裝 Microsoft Windows HTTP Services Certificate Configuration Tool。如果要取得這個工具,請造訪下列 Microsoft 網站:
  2. 在命令提示字元中執行下列命令:
    WinHttpCertCfg.exe –i PfxFile -c LOCAL_MACHINE\MY -p Password
    注意PfxFile 是 .pfx 檔案的名稱。Password 是 .pfx 檔案的密碼。如果檔案不需要密碼,請省略 -p 參數。

    一般來說,WinHttpCertCfg.exe 檔案位於下列資料夾中:
    C:\Program Files\Windows Resource Kits\Tools
如果您無法存取 .pfx 檔,並且已經在執行 Microsoft Windows Server 2003 或 Microsoft Windows 2000 Server 的電腦上安裝「Microsoft 憑證服務」,您可以要求並且在本機電腦存放區中直接安裝用戶端憑證。如果要執行這項操作,請依照下列步驟執行:
  1. 使用具有系統管理員身分的使用者帳戶登入用戶端電腦。
  2. 在 Microsoft Internet Explorer 中造訪憑證授權單位 (CA) 網站。例如,如果 CA 伺服器名稱為 CAServer,請造訪下列網站:
    http://CAServer/certsrv
  3. [選擇工作] 下方按一下 [要求憑證],然後按一下 [進階憑證要求]
  4. 按一下 [向這個 CA 建立並提交一個要求]
  5. [進階憑證要求] 表單中,請輸入名稱和電子郵件位址。
  6. [所需的憑證類型] 區域中,按一下 [用戶端驗證憑證]
  7. [金鑰選項] 區域中,按一下以選取 [將憑證存放在本機電腦憑證存放區] 核取方塊,然後按一下 [提交]

    請注意用戶端憑證的「要求識別碼」。
  8. [隱藏性指令碼執行違規] 對話方塊中,按一下 [是]
  9. 在 CA 發行用戶端憑證後,請按一下 [首頁],然後按一下 [檢視擱置中的憑證要求狀態]
  10. [請選擇您想檢視的憑證要求] 下方,按一下在步驟 7 中提交的憑證要求。
  11. 按一下 [安裝這個憑證],然後在 [隱藏性指令碼執行違規] 對話方塊中按一下 [是]

步驟 2:設定用戶端憑證的存取權限

在這個步驟中,您必須授予 ASP.NET 帳戶存取存放在本機電腦存放區中的用戶端憑證權限。Network Service 帳戶是在 Windows Server 2003 中執行 Web 應用程式的預設帳戶。因此,您必須授予 Network Service 帳戶憑證的存取權限。如果您已經設定自訂帳戶執行 ASP.NET,就必須授予自訂帳戶存取權限。

注意 在 Microsoft Internet Information Server (IIS) 5.0 中,ASP.NET 是在 ASPNET 帳戶而不是在 Network Service 帳戶下執行。因此,您必須在執行 IIS 5.0 的電腦上授予 ASPNET 帳戶權限。

如果要授予特定使用者帳戶的存取權限,請在命令提示字元中執行下列命令:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "AccountName"
注意AccountName 是本機電腦帳戶或網域帳戶的名稱,IssuedToName 則是發行用戶端憑證的公司或網域名稱。這個命令包含不區分大小寫的搜尋字串,這個搜尋字串會尋找主旨名稱包含該字串的第一個列舉憑證。

以下範例 (命令列命令) 說明如何將用戶端憑證的存取權限,授予 Microsoft Internet Information Services (IIS) 6.0 中的 Network Service 帳戶:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "NetworkService"
以下範例 (命令列命令) 說明如何將用戶端憑證的存取權限授予 IIS 5.0 中的 ASPNET 帳戶:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "ASPNET"
注意 當您使用 Windows HTTP Services Certificate Configuration Tool 時,可以將匯入用戶端憑證的程序,以及設定用戶端憑證存取權限的程序結合成單一步驟。例如,下列命令列命令會同時執行兩個程序:
Winhttpcertcfg.exe -i PFXFile -c LOCAL_MACHINE\My -a "AccountName"

步驟 3:從本機使用者存放區將用戶端憑證複製到本機電腦存放區

如果互動式應用程式 (例如 Windows Form 應用程式或命令列應用程式) 能夠存取用戶端憑證,就會將用戶端憑證存放在本機使用者存放區中。然而,如果服務應用程式 (例如 ASP.NET Web 應用程式) 無法存取相同的用戶端憑證,就不會將用戶端憑證存放在本機電腦存放區中。

這個步驟將告訴您,如何使用「憑證匯出精靈」從本機使用者存放區將用戶端憑證複製到本機電腦存放區中。

注意 如果用戶端憑證已經在本機電腦存放區中,或是如果您可以像「步驟 1」一樣直接將用戶端憑證安裝在本機電腦存放區中,請跳至「步驟 4」。然而,如果您執行「步驟 3」,就必須回到「步驟 2」授予用戶端憑證的存取權限。

如果要將用戶端憑證複製到本機電腦存放區,請依照下列步驟執行:
  1. 按一下 [開始],再按 [執行],輸入 mmc,再按一下 [確定]
  2. [檔案] 功能表上,按一下 [新增/移除嵌入式管理單元],然後按一下 [新增]
  3. [新增獨立嵌入式管理單元] 對話方塊中,依序按一下 [憑證][新增][電腦帳戶][下一步],然後按一下 [完成]
  4. [新增獨立嵌入式管理單元] 對話方塊中,依序按一下 [憑證][新增][我的使用者帳戶],然後按一下 [完成]
  5. 按一下 [關閉],再按一下 [確定]
  6. 如果要從本機使用者存放區匯出用戶端憑證,請依照下列步驟執行:
    1. 依序展開 [憑證 - 目前的使用者][個人],然後按一下 [憑證]
    2. 用滑鼠右鍵按一下用戶端憑證,然後依序按一下 [所有工作][匯出][下一步]
    3. 如果無法使用 [是,匯出私密金鑰] 選項,ASP.NET Web 應用程式就無法使用用戶端憑證,您必須取得其他用戶端憑證。如果要執行這項操作,請依照「步驟 1」和「步驟 2」中的指示執行。否則,請按一下 [是,匯出私密金鑰],再按兩次 [下一步]
    4. [密碼] 方塊和 [確認密碼] 方塊中,輸入密碼並按一下 [下一步]
    5. [檔案名稱] 方塊中輸入檔案名稱,然後依序按一下 [下一步][完成]
    6. [憑證匯出精靈] 對話方塊中,按一下 [確定]
  7. 如果要將用戶端憑證匯入本機電腦存放區,請依照下列步驟執行:
    1. 依序展開 [憑證 (本機電腦)][個人]
    2. 用滑鼠右鍵按一下 [憑證],然後依序按一下 [所有工作][匯入][下一步]
    3. [檔案名稱] 方塊中,輸入步驟 6e 中指定的檔案名稱,然後按一下 [下一步]
    4. [密碼] 方塊中,輸入步驟 6d 中指定的密碼,再按兩次 [下一步]
    5. 按一下 [完成],再按一下 [確定]

步驟 4:安裝 CA 的根憑證

如果用戶端憑證已經由外部 CA (例如 VeriSign) 加以簽署,或是已經安裝 CA 的根憑證,就可以跳過「步驟 4」。

根據預設,許多外部 CA 的根憑證都已經預先安裝在 Windows 的「信任的根憑證授權存放區」中。
檢查是否已經安裝根憑證
如果要檢查是否已經安裝 CA 的根憑證,請依照下列步驟執行:
  1. 按一下 [開始],再按 [執行],輸入 mmc,再按一下 [確定]
  2. [檔案] 功能表上,按一下 [新增/移除嵌入式管理單元],然後按一下 [新增]
  3. [新增獨立嵌入式管理單元] 對話方塊中,依序按一下 [憑證][新增][電腦帳戶][下一步],然後按一下 [完成]
  4. 按一下 [關閉],再按一下 [確定]
  5. 依序展開 [憑證 (本機電腦)][信任的根憑證授權],然後按一下 [憑證]
  6. 確認右邊窗格中已經列出您要使用的 CA 根憑證。
安裝根憑證
如果想要使用的 CA 根憑證並未列出,您必須安裝根憑證。如果想要使用的 CA 根憑證已經以憑證檔案的方式 (例如 .cer、.der 或 .pfx 檔) 發行給您,請依照下列步驟執行:
  1. 展開 [憑證 (本機電腦)],用滑鼠右鍵按一下 [信任的根憑證授權],然後依序按一下 [所有工作][匯入]
  2. [憑證匯入精靈] 對話方塊中,按一下 [下一步],然後在 [檔案名稱] 方塊中輸入憑證檔案的名稱,再按兩次 [下一步]
  3. 按一下 [完成],再按一下 [確定]
要求根憑證
如果想要使用的 CA 包含在「Microsoft 憑證服務」安裝資料庫中,您可以要求根憑證。如果要執行這項操作,請依照下列步驟執行:
  1. 在 Internet Explorer 中造訪 CA 網站。例如,如果 CA 伺服器名稱為 CAServer,請造訪下列網站:
    http://CAServer/certsrv
  2. 按一下 [下載 CA 憑證、憑證鏈結或 CRL],然後按一下 [下載 CA 憑證]
  3. [檔案下載] 對話方塊中,按一下 [儲存]
  4. [另存新檔] 對話方塊中,輸入想要儲存憑證檔案的位置,然後按一下 [儲存]
  5. 在儲存根憑證檔案後,請使用<安裝根憑證>一節中的步驟,在「信任的根憑證授權」存放區中安裝憑證檔案。

呼叫 Web 服務

在您將用戶端憑證安裝在本機電腦存放區或本機使用者存放區後,就可以從 ASP.NET Web 應用程式存取用戶端憑證以呼叫 Web 服務。Windows Form 應用程式或 ASP.NET Web 應用程式在存取用戶端憑證的步驟上是一樣的。

如果您使用 .NET Framework 1.1,必須先將金鑰匯出至使用 DER 編碼的檔案。因為 System.Security.Cryptography.X509Certificates.X509Certificate 類別並未包含從憑證存放區直接存取憑證詳細資料的方法,所以您必須匯出金鑰。因此,應用程式必須從使用 DER 編碼的檔案讀取憑證詳細資料。

注意 Web Services Enhancements 2.0 for Microsoft .NET (WSE) 能提供方法,讓應用程式從憑證存放區直接擷取憑證詳細資料。

下列 C# 範例程式碼會顯示如何以傳遞用戶端憑證進行驗證的方式,呼叫 Web 服務。
using System.Security.Cryptography.X509Certificates;...  public void CallWebService()  {    // TODO: Replace <C:\WSClientCert.cer> with the path of your certificate file.    string certPath = @"<C:\WSClientCert.cer>";    // Create an instance of the Web service proxy.    WebSvc.math mathservice = new WebSvc.math();    // TODO: Replace <https://wsserver/securemath/math.asmx> with a valid URL.    mathservice.Url = @"<https://wsserver/securemath/math.asmx>";    // Create an X509Certificate object from the information     // in the certificate export file, and then add the certificate to the     // ClientCertificates collection of the Web service proxy.    mathservice.ClientCertificates.Add(        X509Certificate.CreateFromCertFile(certPath));    long lngResult = 0;    try    {      lngResult = mathservice.Add(Int32.Parse(operand1.Text),           Int32.Parse(operand2.Text));      string result = lngResult.ToString();    }    catch(Exception ex)    {      if(ex is WebException)      {        WebException we = ex as WebException;        WebResponse webResponse = we.Response;        throw new Exception("Exception calling method. " + ex.Message);      }    }  }

Web Services Enhancements 2.0 for Microsoft .NET

Web Services Enhancements 2.0 for Microsoft .NET (WSE) 是使用最新的 Web Service 通訊協定建立 Web 服務的 Microsoft .NET 類別庫。這些通訊協定包括:
  • WS-Security
  • WS-SecureConversation
  • WS-Trust
  • WS-Policy
  • WS-SecurityPolicy
  • WS-Addressing
  • WS-Attachments
注意 WSE 不是 .NET Framework 的一部分。如果要取得 WSE,請造訪下列 Microsoft 網站:您不需使用其中任一種通訊協定來存取需要驗證用戶端憑證的 Web 服務,但應該會想使用 Microsoft.Web.Services2.Security.X509 類別。Microsoft.Web.Services2.Security.X509 類別包含直接存取憑證存放區中之用戶端憑證的方法。如果您使用這些方法,就不需要將憑證匯出至檔案。

下列 C# 範例程式碼會顯示如何在本機電腦存放區中,尋找名為 SecureMathClient 的第一個憑證。接著這個範例程式碼會使用憑證呼叫數學 Web 服務的 Add 方法。這個數學 Web 服務需要用戶端憑證。
...  // TODO: Replace <SecureMathClient> with the name of the client certificate.  string certName = "<SecureMathClient>";  // WSE 2.0 method  X509CertificateStore store =    X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);  store.OpenRead();  // Look for the first certificate that is named SecureMathClient.  // Look in the local machine store.  X509CertificateCollection col=     (X509CertificateCollection)store.FindCertificateBySubjectString(certName);  X509Certificate cert =null;  try  { // This sample obtains the first matching certificate from the collection.    cert = col[0];  }   catch(Exception ex)  {    throw new Exception("Certificate not Found!");  }  // Create an instance of the Web service proxy.  math mathservice = new math();  // TODO: Replace <https://wsserver/securemath/math.asmx> with a valid URL.  mathservice.Url = @"<https://wsserver/securemath/math.asmx>";  mathservice.ClientCertificates.Add(cert);  long lngResult = 0;  try  {    lngResult = mathservice.Add(Int32.Parse(operand1.Text),         Int32.Parse(operand2.Text));    result.Text = lngResult.ToString();  }  catch(Exception ex)  {    if(ex is WebException)    {      WebException we = ex as WebException;      WebResponse webResponse = we.Response;      throw new Exception("Exception calling method. " + ex.Message);    }  }
参考
如需有關 System.Security.Cryptography.X509Certificates.X509Certificate 類別的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站: 如需有關如何使用 ASP.NET Web 應用程式呼叫安全網站的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
817854FIX:ASP.NET Web 應用程式無法將用戶端認證傳送至安全網站上
內容

文章識別碼:901183 - 最後檢閱時間:12/04/2007 20:11:00 - 修訂: 2.2

  • Microsoft .NET Framework 1.1
  • kbhowto kbinfo kbwebservices kbcode kbcertservices KB901183
意見反應