Я использую Visual Studio 2013 (С#) для цифровой подписи документа с использованием сертификата с смарт-карты. Я не могу определить сертификат, который в настоящее время вставлен в устройство чтения карт: (
Windows копирует сертификаты со всех вставленных в считыватель карт и сохраняет их в магазине. Я хочу использовать в кармане только карточку.
Используемый код I
public static byte[] Sign(Stream inData, string certSubject)
{
// Access Personal (MY) certificate store of current user
X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
my.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
// Find the certificate we'll use to sign
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
// We found it.
// Get its associated CSP and private key
if (cert.HasPrivateKey) {
csp = (RSACryptoServiceProvider)cert.PrivateKey;
if (csp.CspKeyContainerInfo.HardwareDevice)
Console.WriteLine("hardware");
Console.WriteLine(cert.ToString());
}
}
}
if (csp == null)
{
throw new Exception("No valid cert was found");
}
// Hash the data
SHA1Managed sha1 = new SHA1Managed();
byte[] hash = sha1.ComputeHash(inData);
// Sign the hash
return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
}
Но когда пользователь доступа cert.PrivateKey получает запрос на вставку карты в считывающее устройство. Как обнаружить и пропустить эту подсказку для карты или определить, что в настоящее время у читателя есть соответствующая карта HAS?
Я просто хочу использовать сертификат из смарт-карты, который в настоящее время находится в читателе.