【发布时间】:2017-01-06 02:46:11
【问题描述】:
我有一个 C# windows 窗体应用程序。用户键入消息、主题、收件人,并从下拉列表中选择签名证书以使用X509Certificate2 类对电子邮件进行签名。
以下是用于填充下拉列表 (ComboBox SigningCertList) 的 sn-p 的方式:
try
{
X509Certificate2[] certs;
certs = CryptoHelper.GetSigningCertificateList();
SigningCertList.Items.AddRange(certs);
SigningCertList.ValueMember = "SerialNumber";
SigningCertList.DisplayMember = "FriendlyName";
SigningCertList.SelectedIndexChanged += new System.EventHandler(SigningCertList_SelectedIndexChanged);
SigningCertList.SelectedItem = 0;
}
症状很奇怪。组合框将显示我的签名证书(从 p12 文件安装)。但是,如果我加载 Windows 证书 MMC 管理单元,则在搜索时找不到它。重新安装证书后,我在 Windows 证书 MMC 管理单元中看到它,现在在下拉列表中重复。只有列表中的第二个(或最后一个/最近的)签名证书实际上对其进行了签名。
那么如何确保X509Certificate2 类不会返回重复的签名证书?
下面是 GetSigningCertificateList() 方法: `public static X509Certificate2[] GetSigningCertificateList() { var list = new List();
int matches = 0;
X509Store localStore = new X509Store(StoreLocation.LocalMachine);
localStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
try
{
foreach (X509Certificate2 cert in localStore.Certificates)
{
foreach (X509Extension extension in cert.Extensions)
{
X509KeyUsageExtension usageExtension = extension as X509KeyUsageExtension;
if (usageExtension != null)
{
bool matchesUsageRequirements = ((X509KeyUsageFlags.DigitalSignature & usageExtension.KeyUsages) == X509KeyUsageFlags.DigitalSignature);
if (matchesUsageRequirements)
{
list.Add(cert);
matches += 1;
}
}
}
}
}
finally
{
localStore.Close();
}
X509Store userStore = new X509Store(StoreLocation.CurrentUser);
userStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
try
{
foreach (X509Certificate2 cert in userStore.Certificates)
{
foreach (X509Extension extension in cert.Extensions)
{
X509KeyUsageExtension usageExtension = extension as X509KeyUsageExtension;
if (usageExtension != null)
{
bool matchesUsageRequirements = ((X509KeyUsageFlags.DigitalSignature & usageExtension.KeyUsages) == X509KeyUsageFlags.DigitalSignature);
if ((matchesUsageRequirements) && cert.FriendlyName.IndexOf("MYcompanyname.",0) >= 0)
{
list.Add(cert);
matches += 1;
}
}
}
}
}
finally
{
userStore.Close();
}
return list.ToArray();
}
}`
【问题讨论】:
-
您没有显示帮助代码,因此不确定它在哪里搜索。请注意,在 MMC 中,它允许您查看您的帐户和计算机帐户。如果您不知道计算机帐户是什么,请学习它,您可能会在那里拥有重复的证书。
-
在 FormLoad 上调用 try 代码,因此使用 GetSigningCertificateList() 方法执行搜索。请记住,根据我的帖子,即使在 MMC Snapin 中未找到(搜索所有商店),下拉列表也会在下拉列表中显示签名证书。安装证书后,MMC Snapin 将其显示在个人商店中,现在该应用程序会在下拉菜单中显示两次列出的签名证书。只有下拉列表中的第二个会签署电子邮件。
-
同意@LexLi,显示帮助代码。
-
没问题。你能确定你所说的“帮助代码”是什么意思吗?
-
CryptoHelper.GetSigningCertificateList是您的“帮助代码”。这是与您的问题相关的代码实际存在的地方。
标签: c# x509certificate2