68 lines
2.9 KiB
C#
68 lines
2.9 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Security.Cryptography.X509Certificates;
|
||
|
||
namespace GostXades.Helpers
|
||
{
|
||
public static class CertificateHelper
|
||
{
|
||
/// <summary>
|
||
/// Получение сертификата из личного локального хранилища по отпечатку
|
||
/// </summary>
|
||
/// <param name="thumbprint">Отпечаток требуемого сертификата</param>
|
||
/// <returns>Сертификат с нужным отпечатком</returns>
|
||
public static X509Certificate2 GetCertificateByThumbprint(string thumbprint)
|
||
{
|
||
var certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
|
||
|
||
try
|
||
{
|
||
certificateStore.Open(OpenFlags.ReadOnly);
|
||
var certificateCollection = certificateStore.Certificates
|
||
.Cast<X509Certificate2>()
|
||
.Where(i => string.Equals(i.Thumbprint, thumbprint, StringComparison.InvariantCultureIgnoreCase))
|
||
.ToArray();
|
||
|
||
if (!certificateCollection.Any())
|
||
{
|
||
throw new ArgumentException("Некорректный отпечаток сертификата");
|
||
}
|
||
|
||
var activeCertificates = certificateCollection.Where(i => DateTime.Parse(i.GetEffectiveDateString()) <= DateTime.Now &&
|
||
DateTime.Now <= DateTime.Parse(i.GetExpirationDateString()))
|
||
.ToArray();
|
||
if (activeCertificates.Any())
|
||
{
|
||
return activeCertificates[0];
|
||
}
|
||
|
||
throw new ArgumentException($"Сертификат с указанным отпечатком {thumbprint} недействителен");
|
||
}
|
||
finally
|
||
{
|
||
certificateStore.Close();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получение сертификатов из локального хранилища текущего пользователя
|
||
/// </summary>
|
||
/// <returns>Сертификаты из локального хранилища текущего пользователя</returns>
|
||
public static IEnumerable<X509Certificate2> GetCertificates()
|
||
{
|
||
var certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
|
||
|
||
try
|
||
{
|
||
certificateStore.Open(OpenFlags.ReadOnly);
|
||
return certificateStore.Certificates.OfType<X509Certificate2>();
|
||
}
|
||
finally
|
||
{
|
||
certificateStore.Close();
|
||
}
|
||
}
|
||
}
|
||
}
|