Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从浏览器证书存储中获取用于签名的有效证书_C#_Linq - Fatal编程技术网

C# 从浏览器证书存储中获取用于签名的有效证书

C# 从浏览器证书存储中获取用于签名的有效证书,c#,linq,C#,Linq,我需要在WPF中创建一个简单的签名客户端。工作站已经配置了一组由智能卡导入的证书。其中一个是签名证书,另一个用于电子邮件身份验证和加密 因此,我制作了一个简单的下拉列表,用户可以从列表中选择自己喜欢的证书,但我想排除与文档签名无关的证书。通过检查证书,我可以了解它的用途,然后我想通过编程神奇地阅读它 到目前为止,我写道: IEnumerable<Certificate> certificates; X509Store store = new X509

我需要在WPF中创建一个简单的签名客户端。工作站已经配置了一组由智能卡导入的证书。其中一个是签名证书,另一个用于电子邮件身份验证和加密

因此,我制作了一个简单的下拉列表,用户可以从列表中选择自己喜欢的证书,但我想排除与文档签名无关的证书。通过检查证书,我可以了解它的用途,然后我想通过编程神奇地阅读它

到目前为止,我写道:

        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。这是一个不同的主题