再会

由于出现此错误,我在尝试分配私钥时遇到严重问题。
System.Security.Cryptography.CryptographicException: Keyset does not exist

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

var col = store.Certificates.Find(X509FindType.FindBySerialNumber, "00873476DC47C5BB614EA96F2A9CE744A6", false);
var cert = col[0];
var xmlUnSignedSaml = new XmlDocument();
xmlUnSignedSaml.LoadXml(assertion);
xmlUnSignedSaml.PreserveWhitespace = true;
SignedXml signedXml = new SignedXml(xmlUnSignedSaml);

signedXml.SigningKey = cert.PrivateKey; //<<<--- Exception thrown.

我已验证以下内容:
  • 证书具有私钥。
  • 证书的读取权限被授予IUSR,NETWORK SERVICE,LOCAL SERVICE和MMC控制台上的本地用户上下文。证书位于localMachine-个人文件夹
  • 在“C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys”处的machinekeys文件夹具有相同的读取权限。

  • 我已经检查了以下页面的答案,但绝对没有一个对我有用:
  • Stack Overflow User @blowdart's answer
  • MSDN Answer
  • 其他站点,但这与设置IIS并获取证书以在其中工作有关

  • 我正在Visual Studio中运行应用程序,并且在上面的代码段中,它尝试设置SignedXml's SigningKey时引发异常

    我还可以做些什么来使其启动并运行?
    (事后,我还尝试了对证书和文件夹的“所有人”权限-即使抛出了相同的异常)

    最佳答案

    我已通过以下步骤解决了我的问题:

  • 从Microsoft下载了WCF_Samples以获得对
    FindPrivateKey - 15.5mb in size解决方案。
  • 提取了zip文件
  • 导航到WCF_Samples\WCF\Setup\FindPrivateKey\CS\FindPrivateKey.sln并进行构建。 ctrl+shift+B
  • Main(string args[])方法中添加了以下代码行,因为我很懒,并且不想通过控制台进行操作:args = new string[] { "My", "LocalMachine", "-t", THUMBPRINT_OBTAINED_IN_MMC, "-a" };
  • 运行该应用程序。我找到了 key 的路径并导航到它。原来, key 本身的权限未设置

  • 我更改了 key 本身的权限,然后我的应用程序开始工作。

    10-08 03:59