作法:讓 WCF 能夠存取 X.509 憑證

若要讓 Windows Communication Foundation (WCF) 能夠存取 X.509 憑證,應用程式程式碼必須指定憑證存放區名稱及位置。 在某些狀況下,處理序身分識別必須能夠存取包含與 X.509 憑證相關聯之私密金鑰的檔案。 若要取得與憑證存放區中 X.509 憑證相關聯的私密金鑰,WCF 必須有進行這項作業的權限。 根據預設,只有擁有人和系統帳戶能夠存取憑證的私密金鑰。

讓 WCF 能夠存取 X.509 憑證

  1. 對於用以執行 WCF 的帳戶,授與含有與 X.509 憑證相關聯之私密金鑰之檔案的讀取權限。

    1. 判斷 WCF 是否需要 X.509 憑證之私密金鑰的讀取權限。

      下表詳細列出在使用 X.509 憑證時是否必須要提供私密金鑰。

      X.509 憑證使用方式 私密金鑰
      數位簽署傳出的 SOAP 訊息。 Yes
      確認傳入之 SOAP 訊息的簽章。 No
      加密傳出的 SOAP 訊息。 No
      解密傳入的 SOAP 訊息。 Yes
    2. 判斷憑證存放於其中的憑證存放區位置和名稱。

      憑證存放於其中的憑證存放區會指定於應用程式程式碼或組態中。 例如,下列範例會指定憑證是位於名為 CurrentUserMy 憑證存放區中。

      cc.ClientCredentials.ClientCertificate.SetCertificate(
          StoreLocation.CurrentUser,
          StoreName.My,
          X509FindType.FindBySubjectName,
          "contoso.com");
      
      cc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com")
      
    3. 使用 FindPrivateKey 工具,即可判斷憑證的私密金鑰在電腦上的位置。

      FindPrivateKey 工具需要憑證存放區名稱、憑證存放區位置,以及可以唯一識別該憑證的資料。 此工具會接受憑證的主體名稱或是其指紋來做為唯一識別項。 如需如何判斷憑證指紋的詳細資訊,請參閱如何:擷取憑證的指紋

      下列程式碼範例會使用 FindPrivateKey 工具,配合指紋 46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d 來判斷 CurrentUserMy 存放區中憑證之私密金鑰的位置。

      findprivatekey.exe My CurrentUser -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a  
      
    4. 判斷 WCF 在其下執行的帳戶。

      下表詳細列出在特定情境中用以執行 WCF 的帳戶。

      案例 處理序身分識別
      用戶端 (主控台或 WinForms 應用程式)。 目前登入的使用者。
      自我裝載的服務。 目前登入的使用者。
      裝載於 IIS 6.0 (Windows Server 2003) 或 IIS 7.0 (Windows Vista) 中的服務。 NETWORK SERVICE
      裝載於 IIS 5.X (Windows XP) 中的服務。 由 Machine.config 檔中的 <processModel> 項目控制。 預設帳戶是 ASPNET。
    5. 使用類似 cacls.exe 的工具,對用以執行 WCF 的帳戶授與包含該私密金鑰之檔案的讀取權限。

      下列程式碼範例會針對指定的檔案編輯自主式存取控制清單 (DACL),以授與對該檔案的 NETWORK SERVICE 帳戶讀取 (:R) 存取權。

      icacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /grant "NETWORK SERVICE":R  
      

另請參閱