【发布时间】:2017-11-22 10:05:56
【问题描述】:
我正在通过 C# .NET 构建一个用于文档签名的应用程序(win 表单)。我在签名时遇到了错误。当我在某些计算机(Windows 7、Windows 10,不在 Windows Server 中)上签署文档时,出现错误:“未定义密钥集”。
那么,有人可以指导或建议我如何解决这个问题?非常感谢!
这是我的代码:
// get certficate
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;
}
// using the cert to sign
var cert = LoadCertificateFromWindowsStore();
if (cert.HasPrivateKey) // WORKS!!!
{
signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION
...
【问题讨论】:
-
这不是建议问题的重复。 “Keyset 不存在”和“Keyset 未定义”是 2 个不同的错误代码,出现的原因有 2 个。正如建议的副本所示,“密钥集不存在”通常是权限问题。但是,当无法加载包含密钥的加密服务提供程序时,可能会出现“未定义密钥集”。正如下面的答案所示,这有时可能是由程序和 CSP 之间的 32/64 位不匹配引起的。
标签: c# .net windows digital-signature