访问模拟用户密钥库

时间:2012-05-31 21:37:01

标签: c# impersonation x509certificate2

我正在冒充服务用户帐户,以便连接到需要连接证书的Web服务。我已经在运行代码的机器上的服务帐户上安装了客户端证书但是我收到错误System.Security.Cryptography.CryptographicException:系统找不到指定的文件。

 using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password"))
 {
    var clientCert = new X509Certificate2("filePath", "certPassword");
 }

模拟代码有效,为简洁起见,我已将其删除但我通过记录Environment.UserName来检查以确保我的上下文切换到svcAcctUserName用户,这表明我正在以svcAcctUserName运行。 filePath是正确的,我再次将其删除,但是在创建X509Certificate2对象之前打开并关闭该文件,以确保我同时访问该文件并且我的路径是正确的。

错误令人困惑,因为我提供了路径作为参数,我确信运行代码的用户可以访问。

修改

还尝试这样做:How to call a Web service by using a client certificate for authentication in an ASP.NET Web application

虽然我没有使用asp.net应用程序,但无论如何我试了一下。我将证书加载项添加到mmc,添加了“本地计算机”证书,然后将证书导入到本地计算机的个人存储中。

然后我跑了:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE\My -s issuedToName -a domain\svcAcctUserName

尝试再次运行操作,仍然是同样的问题。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

因此,正如Alex指出的那样,我不了解Windows中证书系统的底层架构。但是,在执行上述步骤并修改我的代码以使用X509Store之后,我就让它工作了。希望这会对某人有所帮助:

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password"))
{
   var store = new X509Store(StoreLocation.LocalMachine);
   store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
   var clientCert = store.Certificates.Find(X509FindType.FindByIssuerName, "IssuerNameHere", false);
   var clientCert2 = new X509Certificate2(clientCert[0]);
}