- Что делать, если неправильно указан контейнер
- Как отозвать сертификат эп
- Криптопро csp: как создать ключевой контейнер
- Криптопро csp: как установить сертификат ключа проверки эп в контейнер – подготовка
- Криптопро csp: пин код для контейнера: несколько важных замечаний
- Криптопро csp: создаем пароль для контейнера
- Перенос криптопро, ключей эцп, сертификатов с одного компьютера на другой – trust me i`m an engineer
- Редактирование системного реестра при закрытом ключе
- Удаление запомненных системой пароли от криптопро
- Активация опции автоматического выбора контейнера
- Переустановка системы криптопро, если закрытый ключ не соответствует открытому
- Заключение
- Удаление запомненных системой пароли от криптопро
- Читаем закрытый ключ и конвертируем
- Шаг 4. скопируйте электронную подпись
- Экспорт закрытого ключа
Что делать, если неправильно указан контейнер
Первым делом убедитесь, что вы правильно указали нужный контейнер при установке сертификата.
Сама процедура установки сводится к следующему:
- Запустите вашу программу «КриптоПро CSP»;
- Кликните на вкладку «Сервис»;
- В данной вкладке кликните на кнопку «Просмотреть сертификаты в контейнере»;

- Далее нажмите на кнопку «Обзор», позволяющую выбрать для просмотра контейнер;
- Укажите корректный параметр, а затем кликните внизу на «Ок»;

- Затем выберите «Далее»;
- При возникновении окна с сообщением «Введите пин-код для контейнера» введите соответствующий пин для носителя;
- Далее нажмите на «Установить»;

- Появится уведомление о замене сертификата. Нажмите на «Да»;
- Сертификат будет установлен.
Как отозвать сертификат эп
1. Подайте заявление на аннулирование ЭП или ЭЦП
Бланк для заполнения можно запросить в том удостоверяющем центре, где вам выдали сертификат ЭП. Для клиентов Контура шаблон заявления опубликован на сайте в разделе «Документы».
В заявлении надо указать серийный номер сертификата. Узнать его можно через программу «КриптоПро CSP»:
- открыть программу «КриптоПро CSP» на компьютере;
- выбрать вкладку «Сервис» и нажать кнопку «Просмотреть сертификаты в контейнере»;
- в открывшемся окне нажать кнопку «Обзор», выбрать нужный ключ из списка, подтвердить выбор и нажать кнопку «Далее»;
- откроется окно, где будет указан серийный номер.
Если сертификат еще не был установлен на компьютер, то заполнить заявление помогут специалисты того удостоверяющего центра, в котором вы его получали.
2. Принесите заполненное заявление в офис УЦ лично.
Отзыв сертификата — такая же важная процедура, как и его выдача. Специалисты УЦ должны идентифицировать владельца перед отзывом, поэтому отправить вместо себя доверенное лицо нельзя.
Если вы не можете посетить офис УЦ Контура лично, то можно вызвать нашего курьера. Он удостоверит личность и примет заявление.
https://www.youtube.com/watch?v=rIOEXCM4PJg
3. Проверьте, что сертификат отозван.
Это произойдет в течение 12 часов после того, как УЦ получит от вас заявление.
Криптопро csp: как создать ключевой контейнер
Ключевой контейнер – это «запароленный» каталог в хранилище (реестре) или системной библиотеке «операционки» (далее – ОС) или на защищенном ключевом USB-носителе: токене, смарт-карте. Он считается одним из инструментов защиты криптографических средств генерации и верификации ЭП, лицензий, сертификатов, паролей и другой личной информации.
Криптометод организации и иерархии персональных данных предусматривает обязательное использование защищенного каталога как части комплекса гарантий сохранности и конфиденциальности сведений, необходимых для активации ЭП. Фактически, создавая новую папку для хранения СКПЭП, доступ к которой обеспечивается путем ввода пароля, пользователь формирует новое хранилище.
Помимо выполнения основных функций – генерации и верификации ЭП – КриптоПро CSP «умеет» функционировать как зависимая компонента: приложение можно вызывать из сторонних программ. Например, через веб-интерфейс сайта УЦ, в который заявитель обратился за услугой обновления СКПЭП.
Испытать работу генератора ключей и ознакомиться с процедурой запроса СКПЭП можно на странице тестового удостоверяющего центра разработчика программного модуля. Ниже мы пошагово опишем этот процесс.
Внимание! Если вы запрашиваете СКПЭП, который планируете использовать при работе с электронной почтой, указывайте «Область применения ключа». Также учитывайте: вы не получите доступа к криптофункциям для e-mail, если указанный адрес электронной почты не совпадает с зарегистрированным в MS Outlook Express.
Чтобы получить возможность применять выданный по удаленному запросу СКПЭП при обмене данными по протоколу TLS, перейдите к разделу «Область применения ключа» и укажите его тип: «Сертификат аутентификации клиента».
Криптопро csp: как установить сертификат ключа проверки эп в контейнер – подготовка
Первый шаг – это заполнение электронного формуляра данными, необходимыми для формирования запроса на создание СКПЭП. Указать потребуется Ф. И. О. заявителя и действительный адрес его электронной почты.
Для примера рассмотрим, как организована процедура в одном из самых популярных центров сертификации – УЦ Такском. Пользователям предоставляется возможность удаленно получить совершенно новый или проапдейтить имеющийся СКПЭП:
- по карточке (маркеру) временного доступа – если заявитель запрашивает документ впервые;
- по текущему сертификату – на основании уже имеющихся сведений с целью их обновления или при условии, что до окончания периода действия СКПЭП остается меньше двух месяцев и/или требуется коррекция юридического адреса и/или краткого наименования организации.
При заполнении формуляра на сайте УЦ Такском потребуется указать паспортные данные руководителя или уполномоченного сотрудника организации:
- Ф. И. О.;
- пол;
- дату и место рождения;
- гражданство;
- наименование основного документа (паспорт гражданина РФ), его серию, номер, дату выдачи;
- полное наименование выдавшего его госоргана;
- код подразделения.
После завершение ввода данных пользователю нужно нажать желтую кнопку «Продолжить». Он перенаправляется на страницу настройки уведомлений и указывает номер контактного телефона. Спустя несколько секунд приходит СМС-сообщение, содержащее код подтверждения – его нужно ввести в строку новой формы.
Второй шаг – выбор ключевого носителя:
- Криптомодуль откроет новое интерактивное окно в случае, если пользователь подключил к рабочей машине несколько токенов (или смарт-карт). Учтите: при подсоединении всего одного считывателя, последний выбирается программой автоматически – никаких оповещений программа не отсылает.
- Укажите нужное устройство или выделите параметр «Реестр», если хотите с помощью КриптоПро CSP установить сертификат сразу в контейнер хранилища ОС.
- Нажмите «Ok».
- Приложение запустит «Биологический датчик случайных чисел» (далее – БДСЧ) – работа с опцией будет доступна в новом окошке. Следуйте интерактивным подсказкам. БДСЧ генерирует первоначальную последовательность датчика случайных чисел (далее – ДСЧ).
Для успешного завершения процесса нужно нажимать кнопки клавиатуры или перемещать мышку в произвольном порядке.
Криптопро csp: пин код для контейнера: несколько важных замечаний
Первое. При переводе строки в состояние «Установить новый пароль» криптопровайдер защитит доступ к контейнеру паролем, который вы будете вводить с клавиатуры. Если вы установите переключатель на поле «Установить мастер-ключ», приложение закодирует для каталога его текущий ЗК.
Для этого выполните следующие действия:
- Введите название контейнера или выделите его из предложенного программой перечня и нажмите кнопку «Выбрать». На нем будет сохранен новый ЗК в закодированном виде.
- Жмите «Ok».
- Если вы отметите галкой строку «Создать новый контейнер», после совершения этой операции в только что сформированном защищенном каталоге будет сохранен его ЗК в закодированном виде.
Второе. Воспользовавшись опцией «Разделить ключ на несколько носителей», вы сможете защитить каталог, обеспечив доступ к нему только с нескольких устройств одновременно. Каждое из них станет носителем обособленного контейнера с собственным пин-кодом. Заполните формуляр, указав необходимые данные:
- количество загрузочных носителей, необходимых для доступа к формируемому ЗК ключевого контейнера;
- общее число устройств – между ними будут распределены части ключа.
КриптоПро CSP запустит процесс формирования новых контейнеров, участвующих в разделении исходного ключа:
- для каждого формируемого каталога открывается окошко выбора ключевого носителя – укажите нужные;
- по окончании упомянутой операции появится окно ДСЧ;
- сгенерировав числовую последовательность, дождитесь формы ввода пин-кодов к ЗК для каждого созданного контейнера.
По очереди введите их все или выберите другой метод защиты доступа к личным данным, щелкнув кнопку «Подробнее».
Криптопро csp: создаем пароль для контейнера
Третий шаг – ввод пин-кода для контейнера, создаваемого средствами КриптоПро CSP. Сохраните его в надежном месте: если вы его потеряете или забудете, пользоваться СКПЭП станет невозможно. Придется оформлять новый документ.
Примечание. При желании повысить уровень защиты личной информации вызовите опцию «Подробнее». В КриптоПро CSP откроется форма с перечнем способов охраны доступа к закрытому ключу (далее – ЗК) создаваемого контейнера – вы сможете выбрать одно из следующих действий:
- установить новый pin-код;
- задать мастер-ключ (закодировать текущий ЗК и преобразовать его в новый);
- сегментировать пароль и разместить его по частям на нескольких носителях.
В токенах и смарт-картах реализована функция поддержки аппаратного pin-кода – если вы используете одного из подобных устройств для создания нового контейнера, скорее всего, КриптоПро CSP «попросит» ввести пароль, который задается по умолчанию:
- 1234567890 – для eToken/JaCarta;
- 12345678 – для Рутокен/ESMART.
Чтобы защитить создаваемый каталог, укажите в поле «Новый пароль» определенную комбинацию символов, которая известна только вам. Повторите ее в строке «Подтверждение» и кликните «Ok».
Вы можете пропустить этот шаг и не задавать пин-код.
Перенос криптопро, ключей эцп, сертификатов с одного компьютера на другой – trust me i`m an engineer
Инструкция по переносу лицензии КриптоПро, закрытых ключей ЭЦП и сертификатов с одного компьютера на другой.
1. Перенос лицензии криптопро.
Серийный номер КриптоПро CSP 3.6 находится в ветке реестра
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Products5480A45343B0B0429E4860F13549069InstallProperties]
в значении параметра ProductID (имя раздела 05480A45343B0B0429E4860F13549069 может оказаться другим).
2. Перенос закрытых ключей ЭЦП. (Имеются ввиду ЭЦП хранящиеся в реестре, для ключей хранящихся на флешках, и токенах действие не требуется.)
2.1 Узнать SID текущего пользователя (нужен пользователь у которого ключи).
Способ 1: командой
whoami /user
Способ 2:Найти ветку реестра[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList].Выбрать SID (имеет вид, например, S-1-5-21-1993962763-492894223-1202660629-6195), и посмотреть ProfileImagePath, в конце строки найдете имя пользователя, которому принадлежит этот SID.
2.2. Для 32 битных систем нужно экспортировать ветку [HKEY_LOCAL_MACHINESOFTWARECrypto ProSettingsUSERSSID_текущего_пользователяKeys] в reg-файл.
Для 64-битных систем нужно экспортировать ветку [HKEY_LOCAL_MACHINESOFTWAREWow6432NodeCrypto ProSettingsUSERSSID_текущего_пользователяKeys].
Эти ветки доступны только для текущего пользователя и при попытке открыть их от имени другого получим: “Не удается открыть <SID>. Не удается открыть этот раздел из-за ошибки. Сведения: Отказано в доступе.” Если у вас нет возможности залогиниться под нужным пользователем, то вам поможет утилита Марка Руссиновича psexec (скачать можно с течнета или отсюда) , которая позволяет запускать процессы от имени системной учетки. С помощью psexec запускаем regedit от имени системы:
psexec -i -d -s c:windowsregedit.exe
и нам становятся доступны все разделы. Этот же трюк спасет если система вообще не загружается, нужно скопировать файл C:WindowsSystem32configSOFTWARE и загрузить его как куст реестра, главное, чтобы файл не был поврежден.
2.3. В reg-файле меняем через автозамену SID_текущего_пользователя, на SID пользователя в новой сисмеме.
2.4. Запускаем reg-файл, после этого все готово, но необходимо будет заново установить личные сертификаты для того что бы привязать сертификаты к контейнерам. Если не видно контейнеров, то неправильно указали SID_пользователя, т.к. контейнеры видны только под тем пользователем, под SID’ом которого они находятся.
Если перенести ключи данным способом не получается можно скопировать ЭЦП на флешку (КриптоПро: Перенос ключей ЭЦП с дискет на флешку или в реестр).
3. Перенос сертификатов.
Способ 1. Экспорт-импорт сертификатов. Выполнить certmgr.msc. В открывшемся окне переходим Личное->Сертификаты. Далее правой кнопкой по сертификату -> Все задачи -> Экспорт… В мастере экспорта нажимаем далее, выбираем экспортировать закрытый ключ или нет, выбираем нужный формат и нажимаем далее. Импорт личных сертификатов, которые используются в КриптоПро, нужно делать через
Панель управления -> КриптоПро -> вкладка “Сервис” -> “Установить личный сертификат”.
При установке личных сертификатов средствами Windows не выполняется привязка закрытого ключа ЭЦП, и, очевидно, работать ничего не будет.
Способ 2. Установка сертификатов из контейнеров ЭЦП. При установке личного сертификата в КриптоПро версии 3.6 и выше существует возможность скопировать сертификат в контейнер закрытого ключа. Данная процедура позволяет значительно облегчить процесс переноса. Если сертификат установлен в контейнер закрытого ключа, не нужно ни чего экспортировать, достаточно просто перенести контейнеры, а потом зайти в
Панель управления -> КриптоПро -> вкладка “Сервис” ->”Просмотреть сертификаты в контейнере”
выбрать нужный контейнер и нажать кнопки “Далее” и “Установить”.
В том случае, если нужно перенести 100500 ключей сразу, поможет одна из составляющих пакета PKI Tools, которая автоматизирует процесс установки сертификатов из контейнеров. Скачать пакет можно отсюда или отсюда.
Редактирование системного реестра при закрытом ключе
Хорошие результаты в решении проблемы с несоответствием закрытого ключа в контейнере открытому ключу даёт редактирование системного реестра.
Выполните следующее:
- Нажмите на сочетание клавиш Win R;
- В появившемся окне будет необходимо ввести regedit и нажать на ввод;
- В открывшемся окне реестра будет необходимо перейти по следующему пути:

- Там найдите следующую ветку:

- Перейдите в KeyDevices, и выполните удаление там passwords;
- Также перейдите по пути:

И удалите содержимое указанной папки (Keys). Заново выполните установку сертификата.
Удаление запомненных системой пароли от криптопро
Хорошие результаты даёт удаление сохранённых системой паролей. Для удаления имеющихся паролей запустите вашу «КриптоПро», выберите там вкладку «Сервис». В данной вкладке кликните на опцию «Удалить запомненные пароли», установите галочку рядом с «Пользователем», и нажмите далее на «Ок».

Активация опции автоматического выбора контейнера
В системе «КриптоПро» при установке сертификата и выборе контейнера установите галочку рядом с опцией «Найти контейнер автоматически». Это может помочь избежать появления сообщения, когда ключ на указанном контейнере не соответствует.

Переустановка системы криптопро, если закрытый ключ не соответствует открытому
Если ничего из перечисленного не помогло, рекомендуем полностью переустановить систему «КриптоПро», выбрав наиболее актуальную версию продукта.

Это пригодится: при проверке отношений доверия произошла системная ошибка – что делать.
Заключение
Выше мы рассмотрели, почему появляется уведомление «Закрытый ключ на указанном контейнере не соответствует открытому ключу в сертификате», и что необходимо делать для решения возникшей проблемы. Используйте перечисленные нами советы для устранения описанной дисфункции и обеспечения стабильной работы системы «КриптоПро».
Удаление запомненных системой пароли от криптопро
Хорошие результаты даёт удаление сохранённых системой паролей. Для удаления имеющихся паролей запустите вашу «КриптоПро», выберите там вкладку «Сервис». В данной вкладке кликните на опцию «Удалить запомненные пароли», установите галочку рядом с «Пользователем», и нажмите далее на «Ок».

Читаем закрытый ключ и конвертируем
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>
#include "gost_lcl.h"
/* Convert little-endian byte array into bignum */
BIGNUM *reverse32bn(char *b, BN_CTX *ctx)
{
BIGNUM *res;
char buf[32];
BUF_reverse(buf, b, 32);
res = BN_bin2bn(buf, 32, BN_CTX_get(ctx));
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
void xor_material(char *buf36, char *buf5C, char *src)
{
int i;
for(i = 0; i < 32; i )
{
buf36[i] = src[i] ^ 0x36;
buf5C[i] = src[i] ^ 0x5C;
}
}
int make_pwd_key(char *result_key, char *start12, int start12_len, char *passw)
{
int result;
int i;
char pincode4[1024];
int pin_len;
char current[32];
char material36[32];
char material5C[32];
char hash_result[32];
gost_hash_ctx ctx;
init_gost_hash_ctx(&ctx, &GostR3411_94_CryptoProParamSet);
memset(pincode4, 0, sizeof(pincode4));
pin_len = strlen(passw);
if (pin_len*4 > sizeof(pincode4)) { result = 1; goto err; }
for(i = 0; i < pin_len; i )
pincode4[i*4] = passw[i];
start_hash(&ctx);
hash_block(&ctx, start12, start12_len);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, hash_result);
memcpy(current, (char*)"DENEFH028.760246785.IUEFHWUIO.EF", 32);
for(i = 0; i < (pin_len?2000:2); i )
{
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, hash_result, 32);
hash_block(&ctx, material5C, 32);
hash_block(&ctx, hash_result, 32);
finish_hash(&ctx, current);
}
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, start12, start12_len);
hash_block(&ctx, material5C, 32);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, current);
start_hash(&ctx);
hash_block(&ctx, current, 32);
finish_hash(&ctx, result_key);
result = 0; //ok
err:
return result;
}
BIGNUM *decode_primary_key(char *pwd_key, char *primary_key, BN_CTX *bn_ctx)
{
BIGNUM *res;
char buf[32];
gost_ctx ctx;
gost_init(&ctx, gost_cipher_list->sblock);
gost_key(&ctx, pwd_key);
gost_dec(&ctx, primary_key, buf, 4);
res = reverse32bn(buf, bn_ctx);
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
BIGNUM *remove_mask_and_check_public(char *oid_param_set8, BIGNUM *key_with_mask, BIGNUM *mask, char *public8, BN_CTX *ctx)
{
int result;
EC_KEY *eckey = NULL;
const EC_POINT *pubkey;
const EC_GROUP *group;
BIGNUM *X, *Y, *order, *raw_secret, *mask_inv;
char outbuf[32], public_X[32];
ASN1_OBJECT *obj;
int nid;
order = BN_CTX_get(ctx);
mask_inv = BN_CTX_get(ctx);
raw_secret = BN_CTX_get(ctx);
X = BN_CTX_get(ctx);
Y = BN_CTX_get(ctx);
if (!order || !mask_inv || !raw_secret || !X || !Y) { result = 1; goto err; }
obj = ASN1_OBJECT_create(0, oid_param_set8 1, *oid_param_set8, NULL, NULL);
nid = OBJ_obj2nid(obj);
ASN1_OBJECT_free(obj);
if (!(eckey = EC_KEY_new())) { result = 1; goto err; }
if (!fill_GOST2001_params(eckey, nid)) { result = 1; goto err; }
if (!(group = EC_KEY_get0_group(eckey))) { result = 1; goto err; }
if (!EC_GROUP_get_order(group, order, ctx)) { result = 1; goto err; }
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }
if (!EC_KEY_set_private_key(eckey, raw_secret)) { result = 1; goto err; }
if (!gost2001_compute_public(eckey)) { result = 1; goto err; }
if (!(pubkey = EC_KEY_get0_public_key(eckey))) { result = 1; goto err; }
if (!EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y, ctx)) { result = 1; goto err; }
store_bignum(X, outbuf, sizeof(outbuf));
BUF_reverse(public_X, outbuf, sizeof(outbuf));
if (memcmp(public_X, public8, 8) != 0) { result = 1; goto err; }
result = 0; //ok
err:
if (eckey) EC_KEY_free(eckey);
if (result == 0) return raw_secret;
return NULL;
}
int file_length(char *fname)
{
int len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return -1;
fseek(f, 0, SEEK_END);
len = ftell(f);
fclose(f);
return len;
}
int read_file(char *fname, int start_pos, char *buf, int len)
{
int read_len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return 1;
if (start_pos) fseek(f, start_pos, SEEK_SET);
read_len = fread(buf, 1, len, f);
fclose(f);
if (read_len != len) return 1;
return 0; //ok
}
int get_asn1_len(unsigned char *buf, int *size_hdr)
{
int n, i, res;
int pos = 0;
if ((buf[pos]&0x80) == 0) {
*size_hdr = 1;
return buf[pos];
}
n = buf[pos ]&0x7f;
res = 0;
for(i = 0; i < n; i ) {
res = res*256 buf[pos ];
}
*size_hdr = n 1;
return res;
}
#define MAX_HEADER 20000
int read_container(char *fpath, int flag2, char *salt12, char *primary_key, char *masks_key, char *public8, char *oid_param_set8)
{
int result;
char primary_path[1024 30];
char masks_path[1024 30];
char header_path[1024 30];
char header_buf[MAX_HEADER];
int header_len;
int i, len, pos, size_hdr;
if (strlen(fpath)>1024) { result = 1; goto err; }
sprintf(header_path, "%s/header.key", fpath);
if (flag2 == 0)
{
sprintf(primary_path, "%s/primary.key", fpath);
sprintf(masks_path, "%s/masks.key", fpath);
}
else
{
sprintf(primary_path, "%s/primary2.key", fpath);
sprintf(masks_path, "%s/masks2.key", fpath);
}
if (read_file(primary_path, 4, primary_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 4, masks_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 0x26, salt12, 12)) { result = 1; goto err; }
header_len = file_length(header_path);
if (header_len < 0x42 || header_len > MAX_HEADER) { result = 1; goto err; }
if (read_file(header_path, 0, header_buf, header_len)) { result = 1; goto err; }
//------------- skip certificate ---------------------------
pos = 0;
for(i = 0; i < 2; i )
{
get_asn1_len(header_buf pos 1, &size_hdr);
pos = size_hdr 1;
if (pos > header_len-8) { result = 2; goto err; }
}
//------------------ get oid_param_set8 -----------------------
#define PARAM_SET_POS 34
if (memcmp(header_buf pos PARAM_SET_POS, "x6x7", 2) != 0) { result = 2; goto err; }
memcpy(oid_param_set8, header_buf pos PARAM_SET_POS 1, 8);
//------------------ get public8 -----------------------
result = 2; //not found
pos = 52;
for(i = 0; i < 3; i )
{
len = get_asn1_len(header_buf pos 1, &size_hdr);
if (len == 8 && memcmp(header_buf pos, "x8ax8", 2) == 0)
{
memcpy(public8,header_buf pos 2,8);
result = 0; //ok
break;
}
pos = len size_hdr 1;
if (pos > header_len-8) { result = 2; goto err; }
}
err:
OPENSSL_cleanse(header_buf, sizeof(header_buf));
return result;
}
#define START_OID 0x12
#define START_KEY 0x28
unsigned char asn1_private_key[72] = {
0x30,0x46,2,1,0,0x30,0x1c,6,6,0x2a,0x85,3,2,2,0x13,0x30,0x12,6,7,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,6,7,0x2a,0x85,3,2,2,0x1e,1,4,0x23,2,0x21,0
};
int main(int argc, char **argv)
{
int result;
char *container_path;
char *passw;
char salt12[12];
char primary_key[32];
char masks_key[32];
char public8[8];
char oid_param_set8[8];
BN_CTX *ctx;
BIGNUM *key_with_mask;
BIGNUM *mask;
BIGNUM *raw_key;
char pwd_key[32];
char outbuf[32];
ctx = BN_CTX_new();
if (argc == 2)
{
container_path = argv[1];
passw = "";
}
else
if (argc == 3)
{
container_path = argv[1];
passw = argv[2];
}
else
{
printf("get_private container_path [passw]n");
result = 1;
goto err;
}
if (read_container(container_path, 0, salt12, primary_key, masks_key, public8, oid_param_set8) != 0 &&
read_container(container_path, 1, salt12, primary_key, masks_key, public8, oid_param_set8) != 0)
{
printf("can not read container from %sn", container_path);
result = 2;
goto err;
}
make_pwd_key(pwd_key, salt12, 12, passw);
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);
OPENSSL_cleanse(pwd_key, sizeof(pwd_key));
mask = reverse32bn(masks_key, ctx);
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);
if (raw_key)
{
BIO *bio;
store_bignum(raw_key, outbuf, sizeof(outbuf));
memcpy(asn1_private_key START_OID, oid_param_set8, 8);
memcpy(asn1_private_key START_KEY, outbuf, 32);
//bio = BIO_new_file("private.key", "w");
bio = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
PEM_write_bio(bio, "PRIVATE KEY", "", asn1_private_key, sizeof(asn1_private_key));
BIO_free(bio);
OPENSSL_cleanse(outbuf, sizeof(outbuf));
OPENSSL_cleanse(asn1_private_key, sizeof(asn1_private_key));
result = 0; //ok
}
else
{
printf("Error check public keyn");
result = 3;
}
err:
BN_CTX_free(ctx);
OPENSSL_cleanse(salt12, sizeof(salt12));
OPENSSL_cleanse(primary_key, sizeof(primary_key));
OPENSSL_cleanse(masks_key, sizeof(masks_key));
return result;
}
Шаг 4. скопируйте электронную подпись
В некоторых случаях система запросит пароль электронной подписи. Введите его и нажмите «ОК».
Электронная подпись скопирована.
Есть два варианта, которыми может быть установлена электронная подпись:
- В систему может быть установлен только сертификат открытого ключа подписи, а контейнер подписи (содержащий закрытый ключ) останется хранится на носителе электронной подписи. В этом случае каждый раз, когда необходимо будет использовать подпись, потребуется, чтобы в компьютер был вставлен носитель электронной подписи.
- В систему может быть скопирован как сам контейнер подписи (содержащий закрытый ключ), так и сертификат открытого ключа подписи. В этом случае для использования подписи не потребуется вставлять носитель электронной подписи, т.к. закрытый ключ хранится на компьютере.
| Настоятельно рекомендуем устанавливать только сертификат открытого ключа подписи! Копирование контейнера подписи потенциально может привести к компрометации электронной подписи!Главный принцип хранения электронной подписи заключается в том, чтобы к ней имел доступ только владелец подписи. Для этого отлично подходит использование таких носителей электронной подписи, как USB-токен. В случае копирования и последующего хранения электронной подписи в компьютере она может быть скомпрометирована, например, в результате деятельности компьютерного вируса, взлома, получения доступа к компьютеру других лиц (как внешних по отношению к организации, так и внутренних). |
Экспорт закрытого ключа
Для экспорта закрытого ключа выполните следующие действия:
Откройте Крипто-Про CSP. Перейдите во вкладку «Сервис» и нажмите кнопку «Просмотреть сертификаты в контейнере» (Рис. 1).
В открывшемся окне укажите имя ключевого контейнера, нажав «Обзор» (Рис. 2).
Выберите ключевой контейнер пользователя, затем нажмите «Ок» (Рис. 3).
Нажмите «Далее» (Рис. 4).
Далее нажмите кнопку «Свойства» (Рис. 5).
В открывшемся окне перейдите во вкладку «Состав» и нажмите кнопку «Копировать в файл» (Рис. 6).
Откроется мастер экспорта сертификатов. Нажмите «Далее» (Рис. 7).
Далее отметьте «Да, экспортировать закрытый ключ» (1) и нажмите «Далее» (2) (Рис. 8).
Отметьте следующие пункты: «Файл обмена личной информацией – PKCS #12», «Включить по возможности все сертификаты в путь сертификации» и «Экспортировать все расширенные свойства» (1), затем нажмите кнопку «Далее» (2) (Рис. 9).
Укажите пароль и подтверждение пароля (1), затем нажмите кнопку «Далее» (2) (Рис. 10).
Далее укажите имя файла, используя «Обзор» (1), затем нажмите кнопку «Далее» (2) (Рис. 11).
Далее нажмите «Готово» (Рис. 12).
Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13).
Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14).
