0

我正在模拟一个服务用户帐户,以便连接到需要证书才能连接的 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 对象之前打开并关闭了文件,以确保我可以访问该文件并且我的路径是正确的。

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

编辑:

还尝试这样做:如何在 ASP.NET Web 应用程序中使用客户端证书进行身份验证来调用 Web 服务

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

然后我跑了:

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

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

我错过了什么?

4

1 回答 1

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]);
}
于 2012-05-31T23:31:19.150 回答