У меня есть приложение, работающее в Windows, где я хочу подписать данные любым сертификатом смарт-карты.
Извините за мой английский, это не мой родной язык.Вот код, который я использую:
string heslo = "289-Black Joe";
var myStore = new X509Store();
myStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2 cert in myStore.Certificates)
{
if(!cert.HasPrivateKey) continue; // not smartcard for sure
try
{
var rsa = cert.PrivateKey as RSACryptoServiceProvider;
if(rsa == null) continue; // not smart card cert again
if(rsa.CspKeyContainerInfo.HardwareDevice) // sure - smartcard
{
signedHash = rsa.SignHash(HashData(heslo), CryptoConfig.MapNameToOID("SHA1"));
var pom = Encoding.Default.GetString(signedHash);
myStore.Close();
return;
}
} catch(Exception ex)
{
Console.WriteLine(ex);
}
}
myStore.Close();
Код работает, когда в настройках проекта в Build-> Platform target-> Prefer 32-bit установлен флажок.При повторном прохождении сертификатов попадают в сертификат карты, он запрашивает PIN-код карты, и затем мои данные подписываются.Но когда флажок «Предпочитать 32-разрядный» снят (это то, что мне нужно), окно запроса PIN-кода пропускается, потому что не удается получить закрытый ключ сертификата.
Я не совсем уверен, почему это происходит, и яЯ также не очень знаком с работой с сертификатами.