如何:使 X.509 证书可由 WCF 访问

要使 X.509 证书可供 Windows Communication Foundation (WCF) 访问,应用程序代码必须指定证书存储名称和位置。 在某些情况下,进程标识必须具有对包含私钥的文件的访问权限,此私钥与 X.509 证书相关联。 要获取与证书存储中的 X.509 证书关联的私钥,WCF 必须有权执行此操作。 默认情况下,只有所有者和“系统”帐户才可以访问证书的私钥。

使 X.509 证书可由 WCF 访问

  1. 向运行 WCF 的帐户授予对包含与 X.509 证书关联的私钥的文件的读取访问权限。

    1. 确定 WCF 是否需要对 X.509 证书的私钥的读取访问权限。

      下表详细描述在使用某个 X.509 证书时是否必须提供私钥。

      X.509 证书用途 私钥
      对出站 SOAP 消息进行数字签名。
      验证入站 SOAP 消息的签名。
      对出站 SOAP 消息进行加密。
      对入站 SOAP 消息进行解密。
    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 的证书的私钥在 MyCurrentUser 存储中的位置。

      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) 中托管的服务。 网络服务
      在 IIS 5.X (Windows XP) 中托管的服务。 由 Machine.config 文件中的 <processModel> 元素控制。 默认帐户为 ASPNET。
    5. 使用 icacls.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  
      

另请参阅