Установка PIN-кода для смарт-карты программно с использованием GetRSAPrivateKey и. net core - PullRequest
0 голосов
/ 27 апреля 2020

В течение многих лет я использовал метод расширения, найденный по этой ссылке , чтобы получить доступ к сертификату на смарт-карте и предоставить ПИН-код программно, не открывая маску ПИН-кода запроса для пользователя. Теперь с новыми версиями ядра. net оно больше не работает, поэтому я пытаюсь это исправить.

Я знаю, что теперь с новыми версиями фреймворка лучше использовать

* 1006. *

однако таким образом у меня нет доступа к CspKeyContainerInfo (KeyContainerName, ProviderName, ProviderType), необходимому для вызова собственных методов, которые предоставляют PIN

. Есть ли какой-либо способ доступа к той же информации с использованием объекта RSA ?

Или есть лучший / более новый способ предоставления PIN-кода смарт-карты в зависимости от программы?

1 Ответ

1 голос
/ 27 апреля 2020

Код, который вы используете, работает только тогда, когда секретный ключ предоставляется 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}");
}

RSACng-код PIN-кода, скопированный с { ссылка }; потому что этот вопрос кажется лучше раскрытым, а ответ здесь более общий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...