2016-02-23 6 views
0

Мне нужно создать простой клиент подписи в 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(); 
     } 

В результате приведенного выше кода является список, по крайней мере, включает в себя хорошо известный сертификат проверки подлинности электронной почты.

Какое условие следует добавить для проверки наличия у сертификата usage attribute == non repudiation?

+1

Возможно, вы можете посмотреть коллекцию 'Extensions' и найти расширение' KeyUsage' https://msdn.microsoft.com/pl-pl/library/system.security.cryptography.x509certificates.x509keyusageextension(v=vs 0,110) .aspx. Существует свойство KeyUsages, которое должно указать вам, какой сертификат вы действительно проверяете. Я бы поставил это в ответ, но я не уверен, что это то, что вам нужно. –

+0

Вы могли бы отправить ответ, ведь благодаря вам я нашел ** правильное решение –

+0

, это может помочь http://stackoverflow.com/questions/17520736/call-a-https-wcf-service-with- сертификат-аутентификация –

ответ

0

Ключом часть ответа, принятые ФП:

Вы, возможно, могли бы смотреть на Extensions коллекции и поиска для расширения KeyUsage.

https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509keyusageextension(v=vs.110).aspx

Существует KeyUsages свойство, которое должно сказать вам, какой сертификат вы на самом деле изучения.

0

Престижность @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(); 
     } 
Смежные вопросы