Я использовал метод расширения, найденный в этом ссылка в течение многих лет, чтобы получить доступ к сертификату на смарт-карте и предоставить ПИН-код программно, не открывая пользователю маску ПИН-кода запроса. Сейчас с новыми версиями ядра .net уже не работает, поэтому пытаюсь исправить.
Я знаю, что сейчас с новыми версиями фреймворка лучше использовать
RSA rsa = certificate.GetRSAPrivateKey();
Однако таким образом у меня нет доступа к CspKeyContainerInfo (KeyContainerName, ProviderName, ProviderType), необходимому для вызова собственных методов, предоставляющих PIN-код
Есть ли способ получить доступ к той же информации с помощью объекта RSA?
Или есть лучший/более новый способ предоставления PIN-кода смарт-карты программой?
1 ответ
Код, который у вас есть, работает только тогда, когда закрытый ключ предоставляется Windows CAPI. Если закрытый ключ предоставляется Windows CNG, вам нужно сделать его в форме CNG.
private static RSA GetRSAPrivateKeyWithPin(this X509Certificate2 cert, string pin)
{
RSA rsa = cert.GetRSAPrivateKey();
if (rsa is RSACryptoServiceProvider rsaCsp)
{
// Current code
SetPin(rsaCsp);
return rsa;
}
if (rsa is RSACng rsaCng)
{
// Set the PIN, an explicit null terminator is required to this Unicode/UCS-2 string.
byte[] propertyBytes;
if (pin[pin.Length - 1] == '\0')
{
propertyBytes = Encoding.Unicode.GetBytes(pin);
}
else
{
propertyBytes = new byte[Encoding.Unicode.GetByteCount(pin) + 2];
Encoding.Unicode.GetBytes(pin, 0, pin.Length, propertyBytes, 0);
}
const string NCRYPT_PIN_PROPERTY = "SmartCardPin";
CngProperty pinProperty = new CngProperty(
NCRYPT_PIN_PROPERTY,
propertyBytes,
CngPropertyOptions.None);
rsaCng.Key.SetProperty(pinProperty);
return rsa;
}
// If you're on macOS or Linux neither of the above will hit. There's
// also no standard model for setting a PIN on either of those OS families.
rsa.Dispose();
throw new NotSupportedException($"Don't know how to set the PIN for {rsa.GetType().FullName}");
}
PIN-код RSACng, скопированный с https://stackoverflow.com/a/42630670/6535399; потому что этот вопрос кажется более открытым, и ответ здесь более общий.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.