如何:使 X.509 证书可由 WCF 访问
要使 X.509 证书可供 Windows Communication Foundation (WCF) 访问,应用程序代码必须指定证书存储名称和位置。 在某些情况下,进程标识必须具有对包含私钥的文件的访问权限,此私钥与 X.509 证书相关联。 要获取与证书存储中的 X.509 证书关联的私钥,WCF 必须有权执行此操作。 默认情况下,只有所有者和“系统”帐户才可以访问证书的私钥。
使 X.509 证书可由 WCF 访问
向运行 WCF 的帐户授予对包含与 X.509 证书关联的私钥的文件的读取访问权限。
确定 WCF 是否需要对 X.509 证书的私钥的读取访问权限。
下表详细描述在使用某个 X.509 证书时是否必须提供私钥。
X.509 证书用途 私钥 对出站 SOAP 消息进行数字签名。 是 验证入站 SOAP 消息的签名。 否 对出站 SOAP 消息进行加密。 否 对入站 SOAP 消息进行解密。 是 确定在其中存储证书的存储区的位置和名称。
在其中存储证书的证书存储区要么在应用程序代码中指定,要么在配置中指定。 例如,下面的示例指定证书位于名为
CurrentUser
的My
证书存储区中。cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com");
cc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com")
使用 FindPrivateKey 工具确定证书的私钥在计算机上的存储位置。
FindPrivateKey 工具需要证书存储名称、证书存储位置以及可以唯一标识此证书的某些信息。 此工具接受将证书的主题名称或其指纹作为唯一标识符。 要详细了解如何确定证书的指纹,请参阅如何:检索证书的指纹。
下面的代码示例使用 FindPrivateKey 工具来确定指纹为
46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d
的证书的私钥在My
的CurrentUser
存储中的位置。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
确定运行 WCF 的帐户。
下表详细描述针对指定方案运行 WCF 的帐户。
方案 进程标识 客户端(控制台或 WinForms 应用程序)。 当前登录的用户。 自承载服务。 当前登录的用户。 在 IIS 6.0 (Windows Server 2003) 或 IIS 7.0 (Windows Vista) 中托管的服务。 网络服务 在 IIS 5.X (Windows XP) 中托管的服务。 由 Machine.config 文件中的 <processModel>
元素控制。 默认帐户为 ASPNET。使用 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