Я хочу узнать, хранится ли закрытый ключ сертификата на аппаратном устройстве или нет.
Предположим, что используется следующее приложение.
class Program
{
static void Main(string[] args)
{
try
{
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
foreach (X509Certificate2 x509 in store.Certificates)
{
if (x509.HasPrivateKey)
{
AsymmetricAlgorithm a = x509.PrivateKey;
RSACryptoServiceProvider r = a as RSACryptoServiceProvider;
if (null != r)
{
System.Console.WriteLine("hardware: " + r.CspKeyContainerInfo.HardwareDevice);
System.Console.WriteLine("Subject: " + x509.Subject);
System.Console.WriteLine("container: " + r.CspKeyContainerInfo.KeyContainerName);
System.Console.WriteLine("---");
}
}
}
}
catch (CryptographicException ex)
{
Console.WriteLine("Information could not be written out for this certificate.");
}
}
}
Информация, которую я ищу, находится в r.CspKeyContainerInfo.HardwareDevice
.
Но, к сожалению, для хранилищ, предоставляемых базовой смарт-картой csp, мне предлагается вставить устройство после выполнения AsymmetricAlgorithm a = x509.PrivateKey
(если в это время смарт-карта отсутствует).< br> Есть ли способ получить ту же информацию без всплывающего диалогового окна «пожалуйста, вставьте смарт-карту»?