Как связать сертификат с закрытым ключом

Обновлено: 24.04.2024

Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть).

Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись, обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур.

Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не "прирастает" только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали.

1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере

Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й.

Если ее там нет, то скачайте, установите и перезапустите браузер.


2. Если у вас токен (Рутокен например)

Прежде чем система сможет с ним работать понадобится установить нужный драйвер.

Алгоритм такой: (1) Скачиваем; (2) Устанавливаем.

Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей.

3. Если закрытый ключ в виде файлов

Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key

Тут есть тонкость если эти файлы записаны на жесткий диск вашего компьютера, то КриптоПро CSP не сможет их прочитать, поэтому все действия надо производить предварительно записав их на флешку (съемный носитель), причем нужно расположить их в папку первого уровня, например: E:\Andrey\ , если расположить в E:\Andrey\keys\ , то работать не будет.

(Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр)

Нашли файлы, записали на флешку, переходим к следующему шагу.

4. Установка сертификата из закрытого ключа

Теперь нам нужно получить сертификат, сделать это можно следующим образом:

  1. Открываем КриптоПро CSP
  2. Заходим на вкладку Сервис
  3. Нажимаем кнопку Просмотреть сертификаты в контейнере, нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее, появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте "Да")
  4. После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер)

5. Использование электронной подписи без токена или флешки (установка в реестр)

Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий:

  1. Выполните подготовку закрытого ключа, описанную в пунктах (2) или (3)
  2. Далее открываем КриптоПро CSP
  3. Заходим на вкладку Сервис
  4. Нажимаем кнопку Скопировать
  5. С помощью кнопки Обзор выбираем наш ключ
  6. Нажимаем кнопку Далее, потом придумаем какое-нибудь имя, например "Пупкин, ООО Ромашка" и нажимаем кнопку Готово
  7. Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок
  8. Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок

Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта (4).

Важное замечание: портал OpenSRO не "увидит" сертификат, если вышел срок его действия.

Перед установкой личного сертификата с носителя ruToken или eToken необходимо проверить наличие сертификата в контейнере, для этого:

Запустите программу КриптоПро CSP: (Пуск - Настройка - Панель управления - КриптоПро CSP или Пуск - Панель управления - КриптоПро CSP )

Откройте вкладку "Сервис" и нажмите кнопку «Просмотреть сертификаты в контейнере»


В открывшемся окне нажмите кнопку "Обзор"


Выберите контейнер, который необходимо проверить на наличие в нем сертификата, и нажмите кнопку «Ок»


После того, как в поле «Имя ключевого контейнера» установится название контейнера, нажмите кнопку «Далее»


Если откроется окно «Введите pin-код для контейнера», необходимо ввести Pin-код для носителя.
Pin-код по умолчанию: 12345678



Если открылось окно «Сертификат для просмотра», значит в контейнере есть личный сертификат и вы можете его установить.

Экспорт личного сертификата

Для установки сертификата нажмите кнопку «Свойства»


Во вкладке «Состав» нажмите кнопку «Копировать в файл. »


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Далее»


В следующем окне нажмите кнопку «Обзор. »


1. Выбирете рабочий стол

2. Напишите имя файла Например :«Сертификат»


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Готово»


После того как Экспорт будет выполнен успешно нажмите кнопку «ОК»


Установка личного сертификата

Откройте вкладку "Сервис" и нажмите кнопку «Установить личный сертификт. »

Перед установкой личного сертификата с носителя ruToken или eToken необходимо проверить наличие сертификата в контейнере, для этого:

Запустите программу КриптоПро CSP: (Пуск - Настройка - Панель управления - КриптоПро CSP или Пуск - Панель управления - КриптоПро CSP )

Откройте вкладку "Сервис" и нажмите кнопку «Просмотреть сертификаты в контейнере»


В открывшемся окне нажмите кнопку "Обзор"


Выберите контейнер, который необходимо проверить на наличие в нем сертификата, и нажмите кнопку «Ок»


После того, как в поле «Имя ключевого контейнера» установится название контейнера, нажмите кнопку «Далее»


Если откроется окно «Введите pin-код для контейнера», необходимо ввести Pin-код для носителя.
Pin-код по умолчанию: 12345678



Если открылось окно «Сертификат для просмотра», значит в контейнере есть личный сертификат и вы можете его установить.

Экспорт личного сертификата

Для установки сертификата нажмите кнопку «Свойства»


Во вкладке «Состав» нажмите кнопку «Копировать в файл. »


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Далее»


В следующем окне нажмите кнопку «Обзор. »


1. Выбирете рабочий стол

2. Напишите имя файла Например :«Сертификат»


Для подтверждения копирования нажмите кнопку «Далее»


Для подтверждения копирования нажмите кнопку «Готово»


После того как Экспорт будет выполнен успешно нажмите кнопку «ОК»


Установка личного сертификата

Откройте вкладку "Сервис" и нажмите кнопку «Установить личный сертификт. »

Вариант 1 (если сертификат записан в контейнер закрытого ключа)

Зайдите Пуск-Все программы-КРИПТО-ПРО-КриптоПро CSP.

Перейдите на вкладку Сервис.


Нажмите - Просмотреть сертификаты в контейнере.

В открывшемся окне нажмите Обзор.

В открывшемся окне выберите контейнер закрытого ключа, нажмите ОК.

Нажмите Установить, нажмите ОК (или, если сертификат уже присутствовал в хранилище, согласитесь на замену, нажав Да).

Вариант 2 (установка с использованием файла сертификата .cer)

Зайдите Пуск-Все программы-КРИПТО-ПРО-КриптоПро CSP.

Перейдите на вкладку Сервис.


Нажмите - Установить личный сертификат.

Нажмите Обзор и выберите файл сертификата, нажмите Открыть.

Затем нажмите Далее.

Если хотите найти контейнер автоматически, то поставьте галочку Найти контейнер автоматически. При установке этой галочки КриптоПро CSP автоматически найдет контейнер, сответствующий сертификату.

Если Вы хотите выбрать контейнер вручную, то нажмите Обзор-Выберите соответствующий контейнер из списка-Нажмите ОК.

Нажмите Далее, нажмите Готово (если сертификат уже присутствовал в хранилище, согласитесь на замену, нажав Да).

Вот как-то так я делал это:
//---------------------------------------------------------------------------
// получим дескриптор провайдера (и секретного ключа) для подписи

PCCERT_CONTEXT __fastcall Tcrtmgr_win::GetSignKey( AnsiString asGUID, HCRYPTPROV* phCryptProv )
AnsiString asContainerName;
int NumRows, err, i, rez = -1;
PCCERT_CONTEXT pCertContext = NULL;
CRYPT_SIGN_MESSAGE_PARA SigParams;

//HCRYPTPROV hProv;
DWORD dwKeySpec;
BOOL fCallerFreeProv;

// -------------
for( i=0; i < pCertList->Count; i++ )
if( AnsiString( ((ptCards_Store)(pCertList->Items[i]))->guid ) == asGUID )
rez = i;

if( rez != -1 )
asContainerName = AnsiString( ((ptCards_Store)(pCertList->Items[rez]))->conteiner );
>
else
return NULL;
>

pCertContext = GetCertContext( asGUID );

err = CryptFindCertificateKeyProvInfo( pCertContext, 0, NULL);

if( !err)
//Получаем UNICODE-уникальное имя контейнера
provInfo.pwszContainerName = WideString( asContainerName ).c_bstr();

//Получаем UNICODE-имя провайдера
provInfo.pwszProvName = WideString( crtmgr_win->tCrypto.asProviderName ).c_bstr();

//Получаем тип провайдера:
provInfo.dwProvType = 2;

provInfo.dwFlags = 0;
provInfo.cProvParam = 0;
provInfo.rgProvParam = 0;
provInfo.dwKeySpec = AT_SIGNATURE;

CertSetCertificateContextProperty( pCertContext,
CERT_KEY_PROV_INFO_PROP_ID,
0,
&provInfo );
>


if( !CryptAcquireCertificatePrivateKey(
pCertContext,
CRYPT_ACQUIRE_COMPARE_KEY_FLAG | CRYPT_ACQUIRE_SILENT_FLAG,
NULL,
phCryptProv/*&hProv*/,
&dwKeySpec,
&fCallerFreeProv
))
err =GetLastError();
>

CertStore = New Capicom.Store
CertStore.Open
SertForSign = CertStore.Certificates(1)

DataForSign = New Capicom.SignedData
Signer = New Capicom.Signer

Data = Что то что подписываем
Signer.Certificate = SertForSign
DataForSign.Content = Data

Я создавал свою программу в отрыве от хранилищ сертификатов и т.п. Я использую свою внутреннюю базу сертификатов, запросы на которые и сами сертификаты получаются по другим каналам, нежели Web. Поэтому у меня возникла необходимость привязывать сертификат к закр. ключу. Для этого необходимо всего лишь знать точное имя крипто-контейнера и выполнить часть кода, описанную выше.

Cenroll я использовал только для выдачи запроса на сертификат. Всё остальное - CryptoAPI

.
const BYTE* MessageArray[] = ;
DWORD MessageSizeArray[1];
MessageSizeArray[0] = iBufferSize;

SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
SigParams.pSigningCert = pCertContext;

// szOID_OIWSEC_sha1RSASign
// szOID_OIWSEC_sha1
// szOID_OIWSEC_sha
//
if( iSignMode == 0 )
SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411_R3410;
if( iSignMode == 1 )
SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1RSASign;

SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;

//--------------------------------------------------------------------
// With two calls to CryptSignMessage, sign the message.
// First, get the size of the output signed BLOB.

Вы проверяли это?

Вы можете удалить Крипто Ком и посмотреть, как без него?

Неудачных запросов с таким названием организации нет.

Почему возникает ошибка при создании запроса конкретно на Вашем компьютере - неясно. Для уточнения недостаточно данных (если вообще возможно это сделать в рамках форума).

Для Вас есть два пути решения проблемы:
1) более лёгкий - потребует от 1 до 2 часов. Ставите на свободный раздел (с форматированием) WinXP с SP2 с оригинального дистрибутива. Ставите, если есть желание, критические обновления от MS. Потом "КриптоПро CSP 3.0 с SP2".

Читайте также: