Запись сертификата с закрытым ключем на Рутокен Lite

Подскажите пожалуйста, каким образом можно записать объект X509Certificate2 на Рутокен Lite ?
Может есть примеры на C++/C# ?

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Здравствуйте.

alexkhvlg пишет:

Подскажите пожалуйста, каким образом можно записать объект X509Certificate2 на Рутокен Lite ?
Может есть примеры на C++/C# ?

Уточните, пожалуйста, через какой интерфейс необходимо записывать? Для чего будет применяться?

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Строгих зависимостей от интерфейса нет. Хотя чем выше по уровню интерфейс, тем лучше.
Пишется маленькая утилита для получения сертификатов из Службы сертификатов Active Directory и записи их на Рутокен Lite без участия пользователя, с занесением дополнительной информации в MS SQL.

Re: Запись сертификата с закрытым ключем на Рутокен Lite

alexkhvlg пишет:

Строгих зависимостей от интерфейса нет. Хотя чем выше по уровню интерфейс, тем лучше.
Пишется маленькая утилита для получения сертификатов из Службы сертификатов Active Directory и записи их на Рутокен Lite без участия пользователя, с занесением дополнительной информации в MS SQL.

Смотрите пример для CryptoAPI в нашем SDK.
Должно подойти!

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Да это я видел. Но там закрытый ключ уже записан.

Re: Запись сертификата с закрытым ключем на Рутокен Lite

В данный момент проблема с вызовом функции

IntPtr hProv = IntPtr.Zero;
string cspName = "Aktiv ruToken CSP v1.0";
CryptAcquireContext(ref hProv, null, cspName, PROV_RSA_FULL, CRYPT_NEWKEYSET);

Она выдает ошибку
Набор ключей не определен (0x80090019)

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Вообще, хочется повторить функцию утилиты certutil:
certutil -user -csp "Aktiv ruToken CSP v1.0" -importpfx pfx.pfx

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

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Может кому пригодится подсказка как на C# записать сертификат (X509Certificate2) на токен. На этом форуме я такого не нашел.

Создаем контейнер

CryptAcquireContext(ref hProv, null, "Aktiv ruToken CSP v1.0", PROV_RSA_FULL, CRYPT_NEWKEYSET);

Вытаскиваем закрытый ключ из нашего объекта certificate

RSACryptoServiceProvider key = (RSACryptoServiceProvider) certificate.PrivateKey;
byte[] privateKeyBinary = key.ExportCspBlob(true);

Записываем его на токен

IntPtr hKey = IntPtr.Zero;
CryptImportKey(hProv, privateKeyBinary, (UInt32) privateKeyBinary.Length, IntPtr.Zero, 0, ref hKey);

Потом привязываем к ЗК сертификат

CryptSetKeyParam(hKey, KP_CERTIFICATE, certificate.RawData, 0)

И не забываем подчищать за собой

CryptDestroyKey(hKey);
CryptReleaseContext(hProv, 0);

Всевозможные проверки, для наглядности тут не показал.

Узнать имя контейнера, после его создания можно вот таким образом

uint stringLength = 0;
if (CryptGetProvParam(hProv, PP_CONTAINER, null, ref stringLength, 0))
{
    StringBuilder name = new StringBuilder((int) (stringLength + 1));
    if (CryptGetProvParam(hProv, PP_CONTAINER, name, ref stringLength, 0))
    {
        return name.ToString();
    }
}

Re: Запись сертификата с закрытым ключем на Рутокен Lite

Спасибо что самостоятельно разобрались! :)