密钥集未定义。

5
我正在使用C# .NET构建一个文档签名应用程序(Win Form)。在签名过程中,我遇到了一个错误。当我在某些计算机上签署文档(Windows 7、Windows 10,而非Windows Server)时,出现错误:“密钥集未定义”。 请问有人能够提供教程或建议我如何解决这个问题吗?非常感谢! 这是我的代码: // 获取证书 public X509Certificate2 LoadCertificateFromWindowsStore() { X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser); try { x509Store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection numberCerts = (X509Certificate2Collection)x509Store.Certificates; X509Certificate2Enumerator certEnumerator; if (numberCerts.Count == 1) { certEnumerator = numberCerts.GetEnumerator(); while (certEnumerator.MoveNext()) return certEnumerator.Current; return null; } else if (numberCerts.Count > 1) { X509Certificate2Collection chooseCert = X509Certificate2UI.SelectFromCollection(numberCerts, "Certificates List", "Choose your certificate", X509SelectionFlag.SingleSelection);
if (chooseCert.Count == 1) return chooseCert[0]; else return null; } else return null; } catch (CryptographicException e) { Console.WriteLine(e.Message); } finally { x509Store.Close(); } return null; }
// 使用证书进行签名 var cert = LoadCertificateFromWindowsStore(); if (cert.HasPrivateKey) // 工作正常!!! {
signedXml.SigningKey = cert.PrivateKey; // 抛出“密钥集不存在”异常 ...

1
这不是建议问题的副本。 "Keyset does not exist"和"Keyset is not defined"是发生在2个不同原因下的2种不同错误代码。正如建议的重复所示,“Keyset不存在”通常是权限问题。然而,“Keyset未定义”可能会发生在包含密钥的加密服务提供程序无法加载时。如下面的答案所示,这有时可能是程序和CSP之间的32/64位不匹配导致的。 - jproch
1个回答

6
我已解决这个错误。很简单。您选择“平台目标”为x86。
右键单击您的项目 -> 属性 -> 构建 -> 平台目标 -> x86
问候,

非常感谢!我会测试这个! - Tony Luca
3
通常情况下,问题在于程序的位数与 CSP 的位数不匹配。有些情况下,改变平台目标就足够了,但在其他情况下,问题可能是使用了正确位数的 CSP。例如,nCipher CSP 有单独的32位和64位版本。 - jproch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接