C# 从浏览器证书存储中获取用于签名的有效证书
我需要在WPF中创建一个简单的签名客户端。工作站已经配置了一组由智能卡导入的证书。其中一个是签名证书,另一个用于电子邮件身份验证和加密 因此,我制作了一个简单的下拉列表,用户可以从列表中选择自己喜欢的证书,但我想排除与文档签名无关的证书。通过检查证书,我可以了解它的用途,然后我想通过编程神奇地阅读它 到目前为止,我写道:C# 从浏览器证书存储中获取用于签名的有效证书,c#,linq,C#,Linq,我需要在WPF中创建一个简单的签名客户端。工作站已经配置了一组由智能卡导入的证书。其中一个是签名证书,另一个用于电子邮件身份验证和加密 因此,我制作了一个简单的下拉列表,用户可以从列表中选择自己喜欢的证书,但我想排除与文档签名无关的证书。通过检查证书,我可以了解它的用途,然后我想通过编程神奇地阅读它 到目前为止,我写道: IEnumerable<Certificate> certificates; X509Store store = new X509
IEnumerable<Certificate> certificates;
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
try
{
certificates = from X509Certificate2 certificate in store.Certificates
where certificate.HasPrivateKey
&& certificate.NotAfter <= DateTime.Now && certificate.NotBefore >= DateTime.Now
select new Certificate
{
CommonName = certificate.SubjectName.Decode(X500DistinguishedNameFlags.UseUTF8Encoding),
Id = Convert.ToString(certificate.GetSerialNumber())
};
}
finally
{
store.Close();
}
IEnumerable证书;
X509Store=新的X509Store(StoreLocation.CurrentUser);
打开(OpenFlags.ReadOnly);
尝试
{
证书=来自X509Certificate2存储中的证书。证书
其中certificate.HasPrivateKey
&&certificate.NotAfter=DateTime.Now
选择新证书
{
CommonName=certificate.SubjectName.Decode(X500 DifferentizedNameFlags.UseUTF8Encoding),
Id=Convert.ToString(certificate.GetSerialNumber())
};
}
最后
{
store.Close();
}
上述代码的结果是一个列表,其中至少包括一个众所周知的电子邮件身份验证证书
要检查证书是否具有使用属性==不可否认性
?值得@WiktorZychla称赞的条件是什么
IEnumerable<Certificate> certificates;
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
try
{
certificates = from X509Certificate2 certificate in store.Certificates
where certificate.HasPrivateKey
//&& certificate.NotAfter <= DateTime.Now && certificate.NotBefore >= DateTime.Now
//Commented because doesn't work, strangely
&& certificate.Extensions.OfType<X509KeyUsageExtension>().Any(ku => ku.KeyUsages == X509KeyUsageFlags.NonRepudiation)
select new Certificate
{
CommonName = certificate.SubjectName.Decode(X500DistinguishedNameFlags.UseUTF8Encoding),
Id = Encoding.UTF8.GetString(certificate.GetSerialNumber())
};
}
finally
{
store.Close();
}
IEnumerable证书;
X509Store=新的X509Store(StoreLocation.CurrentUser);
打开(OpenFlags.ReadOnly);
尝试
{
证书=来自X509Certificate2存储中的证书。证书
其中certificate.HasPrivateKey
//&&certificate.NotAfter=DateTime.Now
//奇怪的是,因为不起作用而评论
&&certificate.Extensions.OfType().Any(ku=>ku.KeyUsages==X509KeyUsageFlags.NonRepudiation)
选择新证书
{
CommonName=certificate.SubjectName.Decode(X500 DifferentizedNameFlags.UseUTF8Encoding),
Id=Encoding.UTF8.GetString(certificate.GetSerialNumber())
};
}
最后
{
store.Close();
}
OP接受的答案的关键部分是:
您可能可以查看
扩展
集合并搜索键用法
扩展
有
KeyUsages
属性可以告诉您实际检查的证书类型 您可能可以查看扩展
集合并搜索键用法
扩展。有KeyUsages
属性可以告诉您实际检查的证书类型。我想把它写在一个答案中,但我不确定这是你需要的。你可以发布答案,事实上,多亏了你,我找到了正确的解决方案。这可能会有帮助@NewtonSheikh no。这是一个不同的主题