Pkcs11 rutoken ошибка 0x7

CKR_ARGUMENTS_BAD

Недопустимый аргумент

CKR_ATTRIBUTE_READ_ONLY

Невозможно установить или изменить значение атрибута приложением

CKR_ATTRIBUTE_SENSITIVE

Атрибут недоступен для чтения

CKR_ATTRIBUTE_TYPE_INVALID

Некорректный тип атрибута

CKR_ATTRIBUTE_VALUE_INVALID

Некорректное значение атрибута

CKR_BUFFER_TOO_SMALL

Размер заданного буфера является недостаточным для вывода результатов выполнения функции

CKR_CANT_LOCK

Библиотека не поддерживает блокировку для защиты потоков; возвращается только при  вызове функции C_Initialize

CKR_CRYPTOKI_ALREADY_INITIALIZED

Библиотека уже инициализирована (предыдущий вызов функции C_Initialize не был сопровожден  соответствующим вызовом функции  С_Finalize); возвращается только при  вызове функции C_Initialize

CKR_CRYPTOKI_NOT_INITIALIZED

Выполнение функции невозможно, так как библиотека не инициализирована; возвращается только при вызове любой функции, за исключением  C_Initialize и С_Finalize

CKR_DATA_INVALID

Некорректные входные данные для выполнения криптографической операции

CKR_DATA_LEN_RANGE

Входные данные имеют некорректный размер для выполнения криптографической операции

CKR_DEVICE_ERROR

Ошибка при обращении к токену или слоту

CKR_DEVICE_MEMORY

Недостаточно памяти токена для выполнения запрошенной функции

CKR_DEVICE_REMOVED

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

CKR_DOMAIN_PARAMS_INVALID

Функции переданы некорректные или не поддерживаемые параметры домена

CKR_ENCRYPTED_DATA_INVALID

Для операции расшифрования переданы некорректно зашифрованные данные

CKR_ENCRYPTED_DATA_LEN_RANGE

Для операции расшифрования переданы зашифрованные данные некорректного размера

CKR_FUNCTION_CANCELED

Выполнение функции было прервано

CKR_FUNCTION_FAILED

При выполнении функции возник сбой

CKR_FUNCTION_NOT_SUPPORTED

Запрашиваемая функция не поддерживается библиотекой

CKR_FUNCTION_REJECTED

Запрос на подпись был отклонен пользователем

CKR_GENERAL_ERROR

Критическая ошибка, связанная с аппаратным обеспечением

CKR_HOST_MEMORY

Недостаточно памяти для выполнения функции на рабочей станции, где установлена библиотека

CKR_KEY_FUNCTION_NOT_PERMITTED

Атрибуты ключа не позволяют выполнить операцию

CKR_KEY_HANDLE_INVALID

Функции передан некорректный идентификатор (хэндл) ключа

CKR_KEY_NOT_WRAPPABLE

Невозможно зашифровать ключ

CKR_KEY_SIZE_RANGE

Недопустимый размер ключа

CKR_KEY_TYPE_INCONSISTENT

Тип ключа не соответствует данному механизму

CKR_KEY_UNEXTRACTABLE

Невозможно зашифровать ключ, так как атрибут CKA_UNEXTRACTABLE установлен в значение CK_TRUE

CKR_MECHANISM_INVALID

Указан неправильный механизм для выполнения криптографической операции

CKR_MECHANISM_PARAM_INVALID

Указаны неправильные параметры механизма для выполнения криптографической операции

CKR_NEED_TO_CREATE_THREADS

Программа не поддерживает внутренних методов операционной системы для создания новых потоков

CKR_OBJECT_HANDLE_INVALID

Функции передан некорректный идентификатор (хэндл) объекта

CKR_OPERATION_ACTIVE

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

CKR_OPERATION_NOT_INITIALIZED

Невозможно выполнить операцию в этой сессии

CKR_PIN_EXPIRED

Срок действия PIN-кода истек

CKR_PIN_INCORRECT

Функции передан PIN-код, который не соответствует тому, который сохранен на токене

CKR_PIN_INVALID

Значение PIN-кода содержит недопустимые символы

CKR_PIN_LEN_RANGE

Недопустимая длина PIN-кода

CKR_PIN_LOCKED

Авторизация по данному PIN-коду невозможна (превышен допустимый предел последовательного ввода неправильных значений PIN-кода)

CKR_RANDOM_NO_RNG

Данный токен не поддерживает генерацию случайных чисел

CKR_SESSION_CLOSED

Сессия была закрыта во время выполнения функции

CKR_SESSION_COUNT

Достигнуто предельное количество открытых сессий для данного токена

CKR_SESSION_EXISTS

Сессия с токеном уже открыта и поэтому токен не может быть инициализирован

CKR_SESSION_HANDLE_INVALID

Функции передан некорректный идентификатор (хэндл) сеанса

CKR_SESSION_PARALLEL_NOT_SUPPORTED

Данный токен не поддерживает параллельные сессии

CKR_SESSION_READ_ONLY

Невозможно выполнить действие, поскольку это сессия R/O

CKR_SESSION_READ_WRITE_SO_EXISTS

Уже открыта сессия R/W, поэтому открыть сессию R/O невозможно

CKR_SIGNATURE_INVALID

Неверное значение ЭЦП

CKR_SIGNATURE_LEN_RANGE

Значение ЭЦП неверно по длине

CKR_SLOT_ID_INVALID

Слота с данным ID не существует

CKR_TEMPLATE_INCOMPLETE

Для создания объекта недостаточно атрибутов

CKR_TEMPLATE_INCONSISTENT

Заданные атрибуты противоречат друг другу

CKR_TOKEN_NOT_PRESENT

Токен отсутствует в слоте во время вызова функции

CKR_UNWRAPPING_KEY_HANDLE_INVALID

Функции передан некорректный идентификатор (хэндл) ключа дешифрования

CKR_UNWRAPPING_KEY_SIZE_RANGE

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

CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT

Тип ключа дешифрования не соответствует данному механизму

CKR_USER_ALREADY_LOGGED_IN

Данный пользователь уже авторизован

CKR_USER_ANOTHER_ALREADY_LOGGED_IN

Другой пользователь уже авторизован

CKR_USER_NOT_LOGGED_IN

Соответствующий пользователь не авторизован

CKR_USER_PIN_NOT_INITIALIZED

Не инициализирован PIN-код пользователя

CKR_USER_TOO_MANY_TYPES

Невозможно выполнить авторизацию Администратора и Пользователя одновременно

CKR_USER_TYPE_INVALID

Задан некорректный тип пользователя

CKR_WRAPPED_KEY_INVALID

Задан некорректный зашифрованный ключ

CKR_WRAPPED_KEY_LEN_RANGE

Задана некорректная длина зашифрованного ключа

CKR_WRAPPING_KEY_HANDLE_INVALID

Функции передан некорректный идентификатор (хэндл) ключа шифрования

CKR_WRAPPING_KEY_SIZE_RANGE

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

CKR_WRAPPING_KEY_TYPE_INCONSISTENT

Тип ключа шифрования не соответствует данному механизму

Содержание

  1. Ошибки Рутокен
  2. Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
  3. Ошибка: Rutoken перестает определяться (Windows 10)
  4. Ошибка: Панель управления не видит Рутокен ЭЦП 2.0
  5. Почему компьютер не видит носитель рутокен
  6. Первичная диагностика неисправности Рутокен
  7. 1. Повреждение/разлом корпуса или USB-разъема Рутокена
  8. 3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы
  9. 1. Рутокен не определяется в «Панели управления Рутокен»
  10. 2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:
  11. 2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”
  12. 2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”
  13. 2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”
  14. 2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20
  15. 2.5 Референсные данные не найдены
  16. 2.6 «PIN-код заблокирован»
  17. 1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”
  18. 2. Проверка целостности сертификата с неизвлекаемыми ключами
  19. Почему компьютер не видит носитель рутокен
  20. Почему компьютер не видит рутокен
  21. Установка драйвера для Windows Vista Windows Seven
  22. Установка драйвера для Windows XP
  23. Подготовка
  24. Установка драйверов и модулей ruToken
  25. Настройка считывателя в КриптоПро
  26. Установка сертификатов
  27. Почему не виден сертификат ЭЦП на носителе
  28. Причина 1: драйвер не установлен или устройство отображается в диспетчере устройств с восклицательным знаком
  29. Причина 2: долгое опознание носителя на Windows 7
  30. Причина 3: USB-порт работает некорректно
  31. Причина 4: носитель неисправен
  32. Почему выходит ошибка при создании подписи
  33. Устранение ошибки ненайденного элемента ЭЦП
  34. Устранение ошибки с построением цепочки сертификатов

Ошибки Рутокен

Из нашей статьи вы узнаете:

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

Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва

Ошибку можно заметить на вкладке «Сертификаты» непосредственно в панели управления Рутокен. Проблема возникает во время установки ЭЦП и связана с неполной настройкой. Речь про отсутствие специального корневого доверенного сертификата, который выдает удостоверяющий центр.

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

Если в открывшемся дереве вы видите лишь ваш личный сертификат, то надо установить еще один, который был выдан в удостоверяющем центре, и сделать доверенным.

Ошибка: Rutoken перестает определяться (Windows 10)

Потенциально могут возникать периодические ошибки из-за недоступности сертификатов, невозможности запустить панель управления. Одновременно светодиод на токене горит, а сам Рутокен имеется в Диспетчере устройств. Подобная ситуация может быть связана со спецификой работы материнской платы компьютера, когда при переходе из энергосберегающего режима в штатный не происходит «пробуждения» токена. Выходом здесь станет его отключение либо повторное подключение Рутокена (для этого достаточно достать USB-токен из разъема и подключить опять).

В случае если ошибка не исчезла, обратитесь за консультацией в удостоверяющий центр, где вы оформили ЭЦП и приобрели Рутокен.

Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

Для решения проблемы выполните следующие действия:

Если ничего не помогло и ошибка осталась, обращайтесь в удостоверяющий центр «Астрал». Мы предлагаем услуги по генерации ЭЦП любых типов на выгодных условиях, а также комплексное техническое сопровождение. Для решения проблем мы готовы проконсультировать по телефону либо найти выход с помощью удаленного подключения к вашему компьютеру. Получить дополнительную информацию можно по телефону либо оставив заявку на сайте. Мы оперативно ответим и предоставим консультацию.

Источник

Почему компьютер не видит носитель рутокен

Рутокен при подключении к компьютеру не отображается в Панели управления Рутокен, кнопка «Ввести PIN-код» неактивна.

image2018 5 8 14 29 34

Если используется Подключение к удаленному рабочему столу, подробную информацию можно прочитать в этой статье.

Определите модель Рутокен по маркировке на самом ключе, воспользовавшись этой инструкцией.

Возможно, не хватает питания для Рутокена. Попробуйте подключить Рутокен в другой USB-порт.

Если используется удлинитель, подключите Рутокен напрямую.

Проверьте работают ли флешки, другие токены или смарт-карты.

Модель Рутокен S должна отображаться в разделе Контроллеры USB.

image2018 5 8 14 53 13

Модели Рутокен ЭЦП 2.0, Рутокен Lite должны отображаться в разделе Устройства чтения смарт-карт.

*Иногда могут отображаться как «USB Smart Card reader», «Rutoken ECP» или «Rutoken Lite»

image2018 5 8 14 52 26

Откройте Панель управления Рутокен и перейдите на вкладку Настройки.

Проверьте значение в раскрывающемся списке Количество считывателей Рутокен S. Если установлен «0», то увеличьте это значение до 1 и примените изменения

image2018 5 8 14 56 13

Если на другом компьютере Рутокен так же не определяется, скорее всего, он вышел из строя. Обратитесь в компанию, где приобретался Рутокен для его замены.

Источник

Первичная диагностика неисправности Рутокен

В соответствии с правилами эксплуатации и хранения электронных идентификаторов Рутокен, пользователь имеет право бесплатно заменить неисправный носитель Рутокен в течение срока гарантийного обслуживания, если, в ходе проведения экспертизы, случай будет признан гарантийным.

Отправка токена на экспертизу производится через ту компанию, с которой у компании «Актив» имеются договорные отношения.

Таким образом, если вы приобретали Рутокен у одного из наших партнеров, вам нужно передать Рутокен партнеру. Если договор между вашей организацией и компанией «Актив» напрямую не заключался, и вы направите Рутокен нам, мы не сможем принять его на экспертизу.

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

В случае обнаружения пользователем неисправности Рутокена, советуем провести первичную диагностику носителя, прежде чем обратиться в компанию, где приобретался носитель Рутокен.

Самые частые ошибки мы собрали в этой статье.

Первичная диагностика состоит из 3 этапов:

При первичном осмотре Рутокена выявляются механические повреждения, при которых носитель не подлежит замене.

Можно выделить следующие виды механических повреждений:

1. Повреждение/разлом корпуса или USB-разъема Рутокена

image2020 4 17 15 35 9 image2020 4 17 15 34 16

image2020 4 17 15 32 7

3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы

image2020 4 17 16 55 37 image2020 4 17 16 56 4

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

Если при визуальном осмотре Рутокена никаких видимых повреждений не выявлено, необходимо проверить Рутокен на компьютере.

Подключите Рутокен к компьютеру и запустите «Панель управления Рутокен».

Запуск панели управления Рутокен выполняется через меню Пуск / Панель управления / Панель управления Рутокен.

image2020 4 17 17 4 50

Если Рутокен определяется в «Панели управления Рутокен», активна кнопка «Ввести PIN-код…»

Нажмите на кнопку «Информация» на вкладке «Администрирование». Ошибок возникать не должно.

Попробуйте авторизоваться с PIN-кодом пользователя и/или администратора.

Если при нажатии на кнопку «Информация» ошибок не возникает, а авторизация выполняется успешно, следует перейти к третьему этапу диагностики носителя Рутокен

(Рутокен работает корректно, необходимо проверить целостность ключевой информации на Рутокене).

После подключения Рутокена к компьютеру возможны следующие ошибки в Панели управления Рутокен:

1. Рутокен не определяется в «Панели управления Рутокен»

image2020 4 17 17 5 41

Рутокен не определяется в «Панели управления Рутокен» (список «Подключенные Рутокен» пустой) и, как следствие, неактивны кнопки «Ввести PIN-код…» и «Информация…». В данном случае необходимо воспользоваться инструкцией.

2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:

2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”

Oshibka

Подключите Рутокен к другому USB порту. Повторите попытку ввода PIN-кода. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”

6400

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”

F003

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20

image2020 4 17 17 8 59

Ошибка означает, что память на носителя Рутокен была повреждена. Форматирование Рутокена не поможет. Рутокен необходимо передать в ту компанию, в которой приобретался данный носитель для отправки на экспертизу в компанию Актив.

2.5 Референсные данные не найдены

image001

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

Более подробная информация об ошибке есть в статье нашей Базы Знаний.

2.6 «PIN-код заблокирован»

image2020 4 17 17 9 17

Ошибка «PIN-код заблокирован» означает, что Рутокен был заблокирован в результате превышения количества попыток ввода PIN-кода.

Если заблокирован PIN-код пользователя, воспользуйтесь инструкцией.

Если заблокирован PIN-код Администратора, воспользуйтесь инструкцией.

На третьем этапе проверяется целостность ключевой информации, которая содержится на Рутокене.

Определите модель Рутокена по инструкции.

Если используется носитель из семейства Рутокен ЭЦП, проверьте формат ключей по инструкции.

1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”

Выполнить такую проверку можно через программу криптопровайдера, с помощью которой была сгенерирована электронная подпись пользователя, например программа «КриптоПро CSP» или «VipNet CSP»

Тестирование целостности контейнера через «КриптоПро CSP» необходимо проводить по инструкции.

Тестирование целостности контейнера через «VipNet CSP» необходимо проводить по инструкции.

Если операция по проверке ключевого контейнера выполняется без ошибок, значит ключевая информация на носителе Рутокен не повреждена.

2. Проверка целостности сертификата с неизвлекаемыми ключами

Тестирование носителей Рутокен ЭЦП 2.0 с записанными на него неизвлекаемыми ключами ЭП (PKCS#11) пользователями самостоятельно не производится. Удаленная диагностика выполняется сотрудниками технической поддержки компании Актив.

Источник

Почему компьютер не видит носитель рутокен

После прохождения проверки условий подключения по сертификату ключа проверки ЭЦП и выбора сертификата в личном кабинете юридического лица на сайте nalog.ru через Yandex браузер возникает одно из двух сообщений:

«Не удается обнаружить токен или смарт-карту. Подключите Рутокен в любой USB-порт компьютера или к картридеру» или «На Рутокене нет сертификатов. Для доступа к сайту запишите на Рутокен сертификат«.

image2019 9 5 16 7 19 image2019 9 5 16 8 6

Эти ошибки возникают в приложении Рутокен Коннект, установленном на компьютер, если не выполняются условия для успешного входа или выбран неверный вариант входа.

Необходимо определить нужно ли расширение Рутокен Коннект и какой вариант входа нужно использовать.

Расширение Рутокен Коннект должно использоваться для входа на сайт nalog.ru только если используется модель Рутокен ЭЦП 2.0 с записанным на него сертификатом формата PKCS#11 (как для ЕГАИС).

Проверка условий подключения должна завершиться успешно.

2. Если используется другая модель Рутокен и/или на Рутокене содержится сертификат формата «КриптоПро CSP», то выбран правильный вариант:

нужно выполнить одно из трех действий:

a) Удалите адрес lkul.nalog.ru:443 из настроек Рутокен Коннект

image2019 9 5 17 32 40

image2019 9 5 17 37 4

b) Или удалите Адаптер Рутокен Коннект

image2019 9 5 17 41 56

с) Или удалите приложение Рутокен Коннект

image2019 9 5 18 2 17

После выполнения одного из трех действий повторите Проверку условий подключения по сертификату ЭЦП.

Источник

Почему компьютер не видит рутокен

1. Возможно, на токене перегорел светодиод (лампочка). Для проверки следует:

5469

2. Подключить Rutoken к другому USB-порту.

3. Запустить / перезапустить службу «Смарт-карта». Для этого:

4. Переустановить драйвер Rutoken, предварительно отключив носитель от компьютера.
Для этого открыть меню «Пуск» > «Панель управления» > «Установка и удаление программ» (для ОС Windows Vista Windows Seven меню «Пуск» > «Панель управления» > «Программы и компоненты»). В списке найти пункт «Rutoken Drivers» и выбрать «Удалить». После удаления необходимо перезагрузить компьютер и установить драйвер Rutoken заново.

5. В случае, если переустановка драйвера не помогла решить ошибку, необходимо установить драйвер с помощью меню «Диспетчер устройств». Порядок установки зависит от используемой операционной системы. Ниже приведены настройки для:

Установка драйвера для Windows Vista Windows Seven

1. Кликнуть по значку «Мой компьютер» правой кнопкой мыши и выбрать элемент «Свойства».

2. В открывшемся меню выбрать «Диспетчер устройств».

picture 1502

3. В открывшемся окне проверить, нет ли в списке элемента «Другие устройства», обозначенного желтым значком.

picture 826

4. Необходимо выделить строку «ruToken» и выбрать «Обновить драйверы».

picture 827

5. Далее выбрать «Выполнить поиск драйверов на этом компьютере».

picture 828

6. Нажать на кнопку «Обзор», указать каталог C:WindowsSystem32Aktiv Co и нажать на кнопку «Далее». Указанный каталог может быть скрытым. В таком случае необходимо выбрать меню «Сервис» > «Параметры папок» > «Вид», установить переключатель «Показывать скрытые файлы, папки и диски» и повторить выбор каталога.

picture 829

7. Дождаться окончания установки и нажать на кнопку «Закрыть».

picture 830

8. После установки драйвера устройство будет отображаться в разделе «Контроллеры USB». На токене также должен загореться диод.

picture 831

Установка драйвера для Windows XP

1. Кликнуть по значку «Мой компьютер» правой кнопкой мыши и выбрать элемент «Свойства».

2. В окне «Свойства системы» перейти на вкладку «Оборудование» и нажать на кнопку «Диспетчер устройств».

picture 832

3. В открывшемся окне проверить, нет ли в списке элемента «ruToken» (либо «Неизвестное устройство»), обозначенного желтым значком. Необходимо кликнуть по нему правой кнопкой мыши и выбрать «Обновить драйвер».

picture 833

4. В окне «Мастер обновления оборудования» установить переключатель «Установка из указанного места».

picture 834

5. В открывшемся окне нажать на кнопку «Обзор», указать путь к каталогу C:Windowssystem32Aktiv Co
t USB и нажать на кнопку «Далее». Указанный каталог может быть скрытым. В таком случае необходимо выбрать меню «Сервис» > «Параметры папок» > «Вид», установить переключатель «Показывать скрытые файлы, папки и диски» и повторить выбор каталога

picture 835

6. Дождаться окончания установки и нажать на кнопку «Готово».

picture 836

7. По завершении установки драйвера устройство будет отображаться в разделе «Контроллеры универсальной последовательной шины USB». На токене также должен загореться диод.

picture 837

6. В случае если выполнение инструкций не помогло исправить ошибку, токен, скорее всего, неисправен. Чтобы в этом убедиться, следует присоединить Rutoken к компьютеру, на котором никогда не устанавливался драйвер. Если носитель работает корректно, то должен запуститься «Мастер установки нового оборудования». Если при присоединении рутокена ничего не происходит, то носитель, вероятнее всего, неисправен, и его необходимо сменить.

Если сохранилась копия сертификата, следует использовать ее для работы в системе Контур.Экстерн, предварительно установив сертификат. Если копий не сохранилось, необходимо обратиться в сервисный центр для незапланированной замены ключа.

%D0%9C%D0%B0%D1%80%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 %D0%BE%D0%B1%D1%89 206%D1%8577 11.18

%D0%91%D0%B0%D0%BD%D0%BD%D0%B5%D1%80 216%D1%8590 11.10.17

vk 180

Подготовка

Установка драйверов и модулей ruToken

Для установки драйверов необходимо:

Настройка считывателя в КриптоПро

Откроется окно со списком установленных считывателей. Если в списке нет считывателя Все считыватели смарт-карт, нажмите кнопку «Добавить»

Если кнопка «Добавить» не активна, то нужно перейти на вкладку «Общие» и нажать на ссылку «Запустить с правами администратора».
RU 3.6 2.0

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

В следующем окне выберите считыватель Все считыватели смарт-карт и нажмите кнопку «Далее»
RU 3.6 3.0

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

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

Для того, чтобы система стала запрашивать ruToken при входе, с него нужно установить сертификат. Чтобы узнать, как это сделать, перейдите по данной ссылке (нажмите здесь чтобы перейти).

Иногда при работе с электронной цифровой подписью (ЭЦП) выходит ошибка о том, что ПК не видит сертификат подписи на носителе или о том, что при создании подписи была допущена ошибка. Причина может быть в неустановленном или переставшем работать драйвере, в неисправности токена или в неисправности программной части компьютера.

rabota za kompyuterom

Почему не виден сертификат ЭЦП на носителе

Обычно проблема решается простой перезагрузкой компьютера и объясняется сбоем в работе программных компонентов. Но иногда для исправления ошибки нужно переустановить драйвера или обратиться в службу технической поддержки пользователей.

Причина 1: драйвер не установлен или устройство отображается в диспетчере устройств с восклицательным знаком

Если на носителе Рутокен ЭЦП не найдено ни одного сертификата, а в диспетчере устройств носитель отображается с восклицательным знаком, то проблема кроется в драйвере.

Для исправления ситуации нужно извлечь носитель ЭЦП из компьютера и скачать последнюю версию драйвера. Скачивание нужно производить только с официальных ресурсов:

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

Причина 2: долгое опознание носителя на Windows 7

При работе в ОС Windows 7 драйверы могут долго назначаться. Решение проблемы — дождитесь окончания процесса или обновите версию ОС.

Причина 3: USB-порт работает некорректно

Убедитесь, что проблема в USB-порте, а не в носителе ЭЦП, для этого переключите токен к другому порту. Если носитель определился системой, то перезагрузите ПК. Обычно это помогает справиться с проблемой и запустить работу всех USB-портов. Если перезагрузка не помогла, то желательно обратиться в техническую поддержку для устранения неисправности.

sertifikat jeup ne viden na nositele

Причина 4: носитель неисправен

Если при переключении носителя к другому ПК или USB-порту флешку компьютер не видит, то проблема в носителе. Чтобы устранить неисправность, обратитесь в сервисный центр для выпуска нового токена.

Почему выходит ошибка при создании подписи

Ошибка создания подписи обычно имеет в расшифровке два значения:

Неисправность работы подписи связана с некорректной работой криптопровайдера, неустановленными или необновленными сертификатами.

Решение проблемы зависит от типа ошибки и обычно не требует обращения в техническую поддержку.

Устранение ошибки ненайденного элемента ЭЦП

Переустановите криптопровайдер на неисправном ПК с официального портала КриптоПро (https://www.cryptopro.ru/downloads). После этого очистите кэш и временные файлы в используемом браузере, а также кэш Java. Затем удалите личные сертификаты и сертификаты главного удостоверяющего центра. Используйте КриптоПро и заново установите новые в соответствии с именем контейнера. После установки корневых сертификатов:

Если после проделанной работы ошибка сохраняется, то нужно обратиться в сервисный центр.

Устранение ошибки с построением цепочки сертификатов

Обычно ошибку вызывает отсутствие сертификатов доверенных корневых центров. Чтобы устранить неисправность, нужно открыть список сертификатов и найти проблемный. Он будет иметь отметку о проблеме в проверке отношений:

rundll 1

Затем пользователь скачивает с официальной страницы сертификат Минкомсвязи РФ и сертификат удостоверяющего центра, имеющего проблемы в работе. Устанавливают их в раздел «‎Корневые сертификаты»‎, а пошаговый процесс выглядит так:

В нужном сертификате нажать «‎Установить».

error 02

В мастере импорта сертификатов нажать «‎Далее» и в новом окне поставить галочку напротив «‎Поместить все сертификаты в следующем хранилище». Нажать «‎Обзор».

error 03

В открывшемся списке выбрать «‎Доверенные корневые центры» и нажать последовательно «‎ОК» и «‎Далее».

error 04

Нажать «‎Готово», а затем подтвердить установку.

error 05

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

Ошибки в работе носителя электронной подписи могут быть вызваны как неисправностью самого носителя, так и неисправностями в программном обеспечении. Перезагрузите ПК и переключите токен в другой порт, чтобы убедиться в его исправности. Если проблема вызвана тем, что токен поврежден, то необходимо обратиться в сервисный центр компании, выпустившей USB. При ошибке, возникающей во время подписания документа, нужно убедиться в корректной работе всех сертификатов и криптопровайдера и при необходимости провести их полную переустановку.

Источник

Содержание

  1. 0x54f внутренняя ошибка рутокен
  2. Стандартные коды ошибок
  3. Первичная диагностика неисправности Рутокен
  4. Первый этап диагностики — Визуальный осмотр Рутокена
  5. 1. Повреждение/разлом корпуса или USB-разъема Рутокена
  6. 2. На корпусе Рутокена видны следы попыток вскрыть носитель
  7. 3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы
  8. Второй этап диагностики — Возможные ошибки при работе с Панелью управления Рутокен
  9. 1. Рутокен не определяется в «Панели управления Рутокен»
  10. 2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:
  11. 2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”
  12. 2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”
  13. 2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”
  14. 2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20
  15. 2.5 Референсные данные не найдены
  16. 2.6 «PIN-код заблокирован»
  17. Третий этап диагностики — Диагностика ключевой информации, содержащейся на Рутокене
  18. 1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”
  19. 2. Проверка целостности сертификата с неизвлекаемыми ключами
  20. 0x54f внутренняя ошибка рутокен
  21. Стандартные коды ошибок
  22. Ошибки Рутокен
  23. Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
  24. Ошибка: Rutoken перестает определяться (Windows 10)
  25. Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

0x54f внутренняя ошибка рутокен

Все функции из реализации стандарта PKCS#11 возвращают различные коды ошибок. Все возвращаемые коды ошибок делятся на две большие группы:

  • стандартные коды ошибок, которые описаны в стандарте. Для каждого кода ошибки есть разъяснение, в каких ситуациях он может быть возвращен.
  • специальные коды ошибок, которые определяются каждым разработчиком реализации стандарта PKCS#11. Ситуации, в которых могут быть возвращены специальные коды ошибок разработчик реализации стандарта определяет самостоятельно.

Все функции из реализации стандарта PKCS#11 возвращают специальные коды ошибок (определяются производителем).

Все функции из реализации расширения стандарта PKCS#11 возвращают специальные коды ошибок (определяются производителем).

Стандартные коды ошибок

В силу особенностей реализации библиотек rtPKCS11 и rtPKCS11ECP некоторые стандартные функции могут вернуть стандартный код ошибки PKCS#11, не входящий в список допустимых для данной функции. Подобная ситуация является исключением. Стандартные коды ошибок, возвращаемые каждой функцией в исключительных ситуациях, перечислены в описании для каждой функции отдельно.

В таблице ниже приведен список кодов ошибок стандарта PKCS#11 и их описаний, поддерживаемых устройствами Рутокен. Подробную информацию по каждому коду ошибки можно найти в стандарте (английский язык).

Коды ошибок стандарта PKCS #11, поддерживаемые устройствами Рутокен

Источник

Первичная диагностика неисправности Рутокен

В соответствии с правилами эксплуатации и хранения электронных идентификаторов Рутокен, пользователь имеет право бесплатно заменить неисправный носитель Рутокен в течение срока гарантийного обслуживания, если, в ходе проведения экспертизы, случай будет признан гарантийным.

Отправка токена на экспертизу производится через ту компанию, с которой у компании «Актив» имеются договорные отношения.

Таким образом, если вы приобретали Рутокен у одного из наших партнеров, вам нужно передать Рутокен партнеру. Если договор между вашей организацией и компанией «Актив» напрямую не заключался, и вы направите Рутокен нам, мы не сможем принять его на экспертизу.

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

В случае обнаружения пользователем неисправности Рутокена, советуем провести первичную диагностику носителя, прежде чем обратиться в компанию, где приобретался носитель Рутокен.

Самые частые ошибки мы собрали в этой статье.

Первичная диагностика состоит из 3 этапов:

  1. Визуальный осмотр Рутокена. На данном этапе определяется, попадает ли Рутокен под гарантию по сроку его использования, а также выявляются механические повреждения Рутокена.
  2. Возможные ошибки в «Панели управления Рутокен» На данном этапе определяются неисправности, которые могут быть выявлены только путем подключения Рутокена к компьютеру.
  3. Диагностика ключевой информации, содержащейся на Рутокене. На данном этапе проверяется целостность ключевой информации, которая содержится на носителе Рутокен с помощью вспомогательных инструментов, таких как: “Панель управления Рутокен”, “КриптоПро CSP” или «ViPNet CSP».

Первый этап диагностики — Визуальный осмотр Рутокена

При первичном осмотре Рутокена выявляются механические повреждения, при которых носитель не подлежит замене.

Можно выделить следующие виды механических повреждений:

1. Повреждение/разлом корпуса или USB-разъема Рутокена

2. На корпусе Рутокена видны следы попыток вскрыть носитель

3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы

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

Второй этап диагностики — Возможные ошибки при работе с Панелью управления Рутокен

Если при визуальном осмотре Рутокена никаких видимых повреждений не выявлено, необходимо проверить Рутокен на компьютере.

Подключите Рутокен к компьютеру и запустите «Панель управления Рутокен».

Запуск панели управления Рутокен выполняется через меню Пуск / Панель управления / Панель управления Рутокен.

Если Рутокен определяется в «Панели управления Рутокен», активна кнопка «Ввести PIN-код…»

Нажмите на кнопку «Информация» на вкладке «Администрирование». Ошибок возникать не должно.

Попробуйте авторизоваться с PIN-кодом пользователя и/или администратора.

Если при нажатии на кнопку «Информация» ошибок не возникает, а авторизация выполняется успешно, следует перейти к третьему этапу диагностики носителя Рутокен

(Рутокен работает корректно, необходимо проверить целостность ключевой информации на Рутокене).

После подключения Рутокена к компьютеру возможны следующие ошибки в Панели управления Рутокен:

1. Рутокен не определяется в «Панели управления Рутокен»

Рутокен не определяется в «Панели управления Рутокен» (список «Подключенные Рутокен» пустой) и, как следствие, неактивны кнопки «Ввести PIN-код…» и «Информация…». В данном случае необходимо воспользоваться инструкцией.

2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:

2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”

Подключите Рутокен к другому USB порту. Повторите попытку ввода PIN-кода. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20

Ошибка означает, что память на носителя Рутокен была повреждена. Форматирование Рутокена не поможет. Рутокен необходимо передать в ту компанию, в которой приобретался данный носитель для отправки на экспертизу в компанию Актив.

2.5 Референсные данные не найдены

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

Более подробная информация об ошибке есть в статье нашей Базы Знаний.

2.6 «PIN-код заблокирован»

Ошибка «PIN-код заблокирован» означает, что Рутокен был заблокирован в результате превышения количества попыток ввода PIN-кода.

Если заблокирован PIN-код пользователя, воспользуйтесь инструкцией.

Если заблокирован PIN-код Администратора, воспользуйтесь инструкцией.

Третий этап диагностики — Диагностика ключевой информации, содержащейся на Рутокене

На третьем этапе проверяется целостность ключевой информации, которая содержится на Рутокене.

Определите модель Рутокена по инструкции.

Если используется носитель из семейства Рутокен ЭЦП, проверьте формат ключей по инструкции.

1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”

Выполнить такую проверку можно через программу криптопровайдера, с помощью которой была сгенерирована электронная подпись пользователя, например программа «КриптоПро CSP» или «VipNet CSP»

Тестирование целостности контейнера через «КриптоПро CSP» необходимо проводить по инструкции.

Тестирование целостности контейнера через «VipNet CSP» необходимо проводить по инструкции.

Если операция по проверке ключевого контейнера выполняется без ошибок, значит ключевая информация на носителе Рутокен не повреждена.

2. Проверка целостности сертификата с неизвлекаемыми ключами

Тестирование носителей Рутокен ЭЦП 2.0 с записанными на него неизвлекаемыми ключами ЭП (PKCS#11) пользователями самостоятельно не производится. Удаленная диагностика выполняется сотрудниками технической поддержки компании Актив.

Если у вас возникли вопросы — обращайтесь в службу технической поддержки компании “Актив”.

Источник

0x54f внутренняя ошибка рутокен

Все функции из реализации стандарта PKCS#11 возвращают различные коды ошибок. Все возвращаемые коды ошибок делятся на две большие группы:

  • стандартные коды ошибок, которые описаны в стандарте. Для каждого кода ошибки есть разъяснение, в каких ситуациях он может быть возвращен.
  • специальные коды ошибок, которые определяются каждым разработчиком реализации стандарта PKCS#11. Ситуации, в которых могут быть возвращены специальные коды ошибок разработчик реализации стандарта определяет самостоятельно.

Все функции из реализации стандарта PKCS#11 возвращают специальные коды ошибок (определяются производителем).

Все функции из реализации расширения стандарта PKCS#11 возвращают специальные коды ошибок (определяются производителем).

Стандартные коды ошибок

В силу особенностей реализации библиотек rtPKCS11 и rtPKCS11ECP некоторые стандартные функции могут вернуть стандартный код ошибки PKCS#11, не входящий в список допустимых для данной функции. Подобная ситуация является исключением. Стандартные коды ошибок, возвращаемые каждой функцией в исключительных ситуациях, перечислены в описании для каждой функции отдельно.

В таблице ниже приведен список кодов ошибок стандарта PKCS#11 и их описаний, поддерживаемых устройствами Рутокен. Подробную информацию по каждому коду ошибки можно найти в стандарте (английский язык).

Коды ошибок стандарта PKCS #11, поддерживаемые устройствами Рутокен

Источник

Ошибки Рутокен

Из нашей статьи вы узнаете:

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

Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва

Ошибку можно заметить на вкладке «Сертификаты» непосредственно в панели управления Рутокен. Проблема возникает во время установки ЭЦП и связана с неполной настройкой. Речь про отсутствие специального корневого доверенного сертификата, который выдает удостоверяющий центр.

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

  • выберите ваш сертификат в панели управления;
  • нажмите кнопку «Свойства»;
  • выберите вкладку «Путь сертификации».

Если в открывшемся дереве вы видите лишь ваш личный сертификат, то надо установить еще один, который был выдан в удостоверяющем центре, и сделать доверенным.

Ошибка: Rutoken перестает определяться (Windows 10)

Потенциально могут возникать периодические ошибки из-за недоступности сертификатов, невозможности запустить панель управления. Одновременно светодиод на токене горит, а сам Рутокен имеется в Диспетчере устройств. Подобная ситуация может быть связана со спецификой работы материнской платы компьютера, когда при переходе из энергосберегающего режима в штатный не происходит «пробуждения» токена. Выходом здесь станет его отключение либо повторное подключение Рутокена (для этого достаточно достать USB-токен из разъема и подключить опять).

В случае если ошибка не исчезла, обратитесь за консультацией в удостоверяющий центр, где вы оформили ЭЦП и приобрели Рутокен.

Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

Для решения проблемы выполните следующие действия:

  • подключите токен к другому USB-разъему или компьютеру для оценки работоспособности;
  • определите наличие устройства через «Диспетчер устройств» в разделе «Контроллеры USB»;
  • проконтролируйте наличие доступа к веткам реестра
    • HKEY_LOCAL_MACHINESOFTWAREMicrosoftCryptographyCalais и
    • HKEY_LOCAL_MACHINESOFTWAREMicrosoftCryptographyCalaisReaders у текущего пользователя и Local Service (если необходимо, то добавьте), также убедитесь, что Служба «Смарт-карта» запущена от имени NT AUTHORITYLocalService («Пуск» — «Панель управления» — «Администрирование» — «Службы»).;
  • проверьте количество считывателей в настройках панели управления (должно быть значение 1);
  • переустановите комплект драйверов для исключения сбоя программного обеспечения.

Если ничего не помогло и ошибка осталась, обращайтесь в удостоверяющий центр «Астрал». Мы предлагаем услуги по генерации ЭЦП любых типов на выгодных условиях, а также комплексное техническое сопровождение. Для решения проблем мы готовы проконсультировать по телефону либо найти выход с помощью удаленного подключения к вашему компьютеру. Получить дополнительную информацию можно по телефону либо оставив заявку на сайте. Мы оперативно ответим и предоставим консультацию.

Источник

В этой статье мы познакомимся со стандартом PKCS#11, предназначенным для работы с различными криптографическими устройствами. Для демонстрации мы будем использовать токены и смарт-карты Рутокен ЭЦП 2.0.

Чтобы вам было проще понять эту информацию, перед её прочтением желательно:

  • ознакомиться с инфраструктурой PKI;

  • знать, что такое CMS-подпись;

  • знать, для чего нужен Рутокен и что он может.

Исходя из определения из Википедии:

PKCS #11 — один из стандартов семейства Public-Key Cryptography Standards (PKCS). Он определяет платформонезависимый программный интерфейс доступа к криптографическим устройствам смарт-картам, токенам, криптографическим ускорителям, серверам ключей и другим средствам криптографической защиты информации. Иногда именуется Cryptoki.

Проще говоря, PKCS#11 определяет платформонезависимый набор функций, структуры, константы и т.п. для работы с криптографическими устройствами. Эти функции могут быть реализованы внутри различных библиотек, например, opensc-pkcs11 или в нашей библиотеке по работе с устройствами Рутокен rtpkcs11ecp. Библиотеки могут отличаться не только реализацией, но и самим набором функций, типов и констант. Это возможно, так как стандарт PKCS#11 описывает различные способы расширения, что позволяет добавлять свои функции, например, для работы с CMS-подписью, флеш-памятью и т.п.

Но давайте обо всем по порядку. В первую очередь, определимся, что из себя представляют функции PKCS#11-библиотек. Функции PKCS#11 внутри — это обертки для работы с токенами и смарт-картами через APDU команды…

Про APDU

APDU — “язык ассемблера” для устройств.

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

  1. Токену или смарт-карте посылается байтовая последовательность;

  2. Операционная система устройства обрабатывает эту последовательность в команду и посылает в ответ код возврата и, при необходимости, дополнительную информацию.

Что же могут содержать внутри себя такие команды? Все, что угодно! Начиная с просьбы отправить информацию об устройстве или записать какие-то данные на него и заканчивая просьбой зашифровать указанное сообщение. Более того, эти команды могут быть разбиты на несколько, что позволяет оптимизировать работу с токеном и сделать ее конвейерной. К примеру, при шифровании сообщения устройству может передаваться небольшая часть сообщения, а он в ответ будет высылать результат шифрования только этой части. Эта особенность может быть использована при работе с данными больших размеров.

И вот вроде бы все хорошо: APDU даёт полную возможность для общения с токеном и смарт-картой, но зачем же тогда нужна PKCS#11-обертка? Причины достаточно очевидны:

  • Работать с шестнадцатеричными байтовыми последовательностями весьма неудобно, каждый раз надо заглядывать в спецификацию команд. Хотелось бы иметь их текстовый эквивалент, а лучше целую библиотеку для разработки.

  • Программирование через APDU-команды имеет “низкий КПД”. При выполнении даже самой простой операции надо написать множество команд. PKCS#11 устраняет эту проблему: при выполнении одной функции PKCS#11 посылается несколько APDU команд. Меньше пишешь — больше делаешь.

Теперь, когда мы знаем что лежит в основе PKCS#11-команд, перейдем к рассмотрению цикла работы с устройством.

Репозиторий с примерами

Чтобы улучшить понимание представленных ниже примеров рекомендуем:

  1. Клонировать репозиторий с примерами.

  2. Выполнить настройку системы согласно README.

  3. Попробовать собрать примеры.

  4. Отформатировать устройство семейства Рутокен ЭЦП 2.0 с помощью примера ex0_format_token.

Цикл работы с токеном

Придержим пока описание содержимого стандарта PKCS#11 и дадим поверхностное представление о том, как происходит работа с токеном в целом. Для этого рассмотрим листинг смены PIN-кода Пользователя на токене и смарт-карте:

#include 
#include "utils.h"

extern CK_FUNCTION_LIST_PTR functionList;                 // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
extern CK_FUNCTION_LIST_EXTENDED_PTR functionListEx;      // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED

int change_pin_code(CK_SLOT_ID slot, char* oldPin, char* newPin);

int main(void)
{
    CK_SLOT_ID_PTR slots;                              // Массив идентификаторов слотов
    CK_ULONG slotCount;                                // Количество идентификаторов слотов в массиве
    char* oldPin = "12345678";
    char* newPin = "12345678";

    CK_RV rv;                                          // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
    int errorCode = 1;                                 // Флаг ошибки

    // инициализируем библиотеку
    if (init_pkcs11()) 
        goto exit;

    // получаем список слотов
    if (get_slot_list(&slots, &slotCount))
        goto free_pkcs11;

    if (slotCount == 0) {
        printf("No token foundn");
        goto free_slots;
    }

    // изменяем PIN-код
    if (change_pin_code(slots[0], oldPin, newPin))
        goto free_slots;


    errorCode = 0;

    /*************************************************************************
    * Очистить память, выделенную под слоты                                  *
    *************************************************************************/
free_slots:
    free(slots);

    /*************************************************************************
    * Деинициализировать библиотеку                                          *
    *************************************************************************/
free_pkcs11:
    free_pkcs11();

exit:
    if (errorCode) {
        printf("nnSome error occurred. Sample failed.n");
    } else {
        printf("nnSample has been completed successfully.n");
    }

    return errorCode;
}

Внутри заголовочного файла utils.h находится описание функций init_pkcs11, free_pkcs11, get_slot_list. Их определение мы дадим ниже.

Всю работу с токеном можно разделить на три этапа:

Подготовительный этап

Мы реализовали его внутри функции init_pkcs11:

#include "utils.h"

CK_FUNCTION_LIST_PTR functionList;                 // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
CK_FUNCTION_LIST_EXTENDED_PTR functionListEx;      // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED
static HMODULE module;

int init_pkcs11()
{
    CK_C_GetFunctionList getFunctionList;              // Указатель на функцию C_GetFunctionList
    CK_C_EX_GetFunctionListExtended getFunctionListEx; // Указатель на функцию C_EX_GetFunctionListExtended

    /* Параметры для инициализации библиотеки: разрешаем использовать объекты синхронизации операционной системы */
    CK_C_INITIALIZE_ARGS initArgs = { NULL_PTR, NULL_PTR, NULL_PTR, NULL_PTR, CKF_OS_LOCKING_OK, NULL_PTR };

    CK_RV rv;                      // Код возврата PKCS#11 функций
    int errorCode = 1;                                 // Флаг ошибки

    /*************************************************************************
    * Выполнить действия для начала работы с библиотекой PKCS#11             *
    *************************************************************************/
    printf("Initialization...n");

    /*************************************************************************
    * Загрузить библиотеку                                                   *
    *************************************************************************/
    module = LoadLibrary(PKCS11_LIBRARY_DIR "/" PKCS11ECP_LIBRARY_NAME);
    CHECK(" LoadLibrary", module != NULL, exit);

    /*************************************************************************
    * Получить адрес функции запроса структуры с указателями на функции      *
    *************************************************************************/
    getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, "C_GetFunctionList");
    CHECK(" GetProcAddress (C_GetFunctionList)", getFunctionList != NULL, unload_pkcs11);

    /*************************************************************************
    * Получить адрес функции запроса структуры с указателями на функции      *
    * расширения стандарта PKCS#11                                           *
    *************************************************************************/
    getFunctionListEx = (CK_C_EX_GetFunctionListExtended)GetProcAddress(module, "C_EX_GetFunctionListExtended");
    CHECK(" GetProcAddress (C_EX_GetFunctionListExtended)", getFunctionList != NULL, unload_pkcs11);

    /*************************************************************************
    * Получить структуру с указателями на функции                            *
    *************************************************************************/
    rv = getFunctionList(&functionList);
    CHECK_AND_LOG(" Get function list", rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Получить структуру с указателями на функции расширения стандарта       *
    *************************************************************************/
    rv = getFunctionListEx(&functionListEx);
    CHECK_AND_LOG(" Get function list extended", rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Инициализировать библиотеку                                            *
    *************************************************************************/
    rv = functionList->C_Initialize(&initArgs);
    CHECK_AND_LOG(" C_Initialize", rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    errorCode = 0;

    /*************************************************************************
    * Выгрузить библиотеку из памяти                                         *
    *************************************************************************/
unload_pkcs11:
    if (errorCode)
        CHECK_RELEASE(" FreeLibrary", FreeLibrary(module), errorCode);
exit:
    return errorCode;
}

Здесь происходит следующее:

  1. В память процесса подгружается PKCS#11-библиотека, хранящаяся по пути PKCS11ECP_LIBRARY_NAME, с помощью функции LoadLibrary (стандартная функция для Windows-систем, для Linux-систем определена обертка).

  2. Далее из библиотеки вытаскиваются указатели на функции C_GetFunctionList и C_EX_GetFunctionListExtended. Первая функция определена в стандарте PKCS#11 и позволяет получить структуру указателей на функции библиотеки. Вторая — является специфичной для библиотеки rtpkcs11ecp и позволяет получить схожую структуру указателей на функции расширения библиотеки. О функциях расширения мы поговорим позже.

  3. Потом мы вызываем полученную функцию C_GetFunctionList и получаем уже саму структуру указателей на функции.

  4. С помощью функции C_Initialize инициализируется загруженная библиотека. Функция C_Initialize в качестве аргумента принимает параметры инициализации библиотеки. Подробнее о них можно почитать здесь, для нас же важен флаг CKF_OS_LOCKING_OK. Его необходимо использовать, если мы хотим использовать библиотеку в нескольких потоках. В нашем примере мы могли бы опустить этот флаг.

Основной этап

Основной этап можно разделить на работу со слотами и работу внутри сессии

Этап работы со слотами

Слот — это дескриптор виртуального интерфейса, куда подключен токен. Конкретно в нашем примере весь этап работы со слотами уместился в определение одной функции get_slot_list:

int get_slot_list(CK_SLOT_ID_PTR* slots_ptr, CK_ULONG_PTR slotCount)
{
    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Получить количество слотов c подключенными токенами                    *
    *************************************************************************/
    rv = functionList->C_GetSlotList(CK_TRUE, NULL_PTR, slotCount);
    CHECK_AND_LOG(" C_GetSlotList (number of slots)", rv == CKR_OK, rvToStr(rv), exit);

    CHECK_AND_LOG(" Checking available tokens", *slotCount > 0, " No tokens available", exit);

    /*************************************************************************
    * Получить список слотов c подключенными токенами                        *
    *************************************************************************/
    *slots_ptr = (CK_SLOT_ID_PTR)malloc(*slotCount * sizeof(CK_SLOT_ID));
    CHECK(" Memory allocation for slots", *slots_ptr != NULL_PTR, exit);

    rv = functionList->C_GetSlotList(CK_TRUE, *slots_ptr, slotCount);
    CHECK_AND_LOG(" C_GetSlotList", rv == CKR_OK, rvToStr(rv), free_slots);
    printf(" Slots available: %dn", (int)*slotCount);

    /*************************************************************************
    * Выставить признак успешного завершения программы                       *
    *************************************************************************/
    errorCode = 0;

free_slots:
    if (errorCode)
    {
        free(*slots_ptr);
    }

exit:
    return errorCode;
}

Работа со слотами происходит примерно в такой последовательности:

  1. Получение списка слотов с помощью функции C_GetSlotList или через функцию ожидания событий, связанных со слотами (пример будет рассмотрен ниже).

  2. Выполнение различных функций работы со слотами. В нашей программе этот этап отсутствует, но его пример можно найти здесь для функции форматирования устройства C_EX_InitToken. Подробнее функции работы со слотами будут описаны ниже.

Этап работы внутри сессии

Сессия — это дескриптор контекста выполнения последовательности операций. Обычно во время сессий выполняются основные функции работы с токеном или смарт-картой: шифрование, подпись и т.п. В нашем случае выполняется смена PIN-кода:

int change_pin_code(CK_SLOT_ID slot, char* oldPin, char* newPin)
{
    CK_SESSION_HANDLE session;                         // Хэндл открытой сессии
    CK_RV rv;                                          // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
    int errorCode = 1;

    /*************************************************************************
    * Открыть RW сессию в первом доступном слоте                             *
    *************************************************************************/
    rv = functionList->C_OpenSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &session);
    CHECK_AND_LOG(" C_OpenSession", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Выполнить аутентификацию Пользователя                                *
    *************************************************************************/
    rv = functionList->C_Login(session, CKU_USER, oldPin, strlen(oldPin));
    CHECK_AND_LOG(" C_Login (CKU_USER)", rv == CKR_OK, rvToStr(rv), close_session);

    /*************************************************************************
    * Установить PIN-код Пользователя по умолчанию                           *
    *************************************************************************/
    printf("nChanging user PIN to default...n");

    rv = functionList->C_SetPIN(session, NULL_PTR, 0, newPin, strlen(newPin));
    CHECK_AND_LOG(" C_SetPIN", rv == CKR_OK, rvToStr(rv), logout);

    printf("User PIN has been changed to default successfully.n");

    errorCode = 0;

    /*************************************************************************
    * Сбросить права доступа                                                 *
    *************************************************************************/
logout:
    rv = functionList->C_Logout(session);
    CHECK_RELEASE_AND_LOG(" C_Logout", rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Закрыть открытую сессию в слоте                                        *
    *************************************************************************/
close_session:
    rv = functionList->C_CloseSession(session);
    CHECK_RELEASE_AND_LOG(" C_CloseSession", rv == CKR_OK, rvToStr(rv), errorCode);
exit:
    return errorCode;
}

Работу внутри сессий можно разделить на несколько этапов:

  1. Открытие сессии в слоте с помощью функции C_OpenSession.

  2. Аутентификация пользователя с помощью функции C_Login. Стандартно на Рутокене присутствуют два пользователя: Администратор (CKU_SO) и Пользователь (CKU_USER). Аутентификация на устройстве — не является обязательной операцией. Она нужна, когда мы хотим получить доступ к операциям и объектам, которые требуют наличия соответствующих прав доступа. В нашем случае, это операция смены PIN-кода Пользователя.

  3. Выполнение различных функций по работе с сессиями. В нашем случае это функция C_SetPIN.

  4. Далее по нисходящей могут идти операции сброса прав доступа (C_Logout) и завершения сессии (C_CloseSession).

Завершающий этап

Весь наш завершающий этап поместился внутри определения функции free_pkcs11:

int free_pkcs11()
{
        CK_RV rv;
        int errorCode;

        printf("nFinalizing... n");

    rv = functionList->C_Finalize(NULL_PTR);
        CHECK_RELEASE_AND_LOG(" C_Finalize", rv == CKR_OK, rvToStr(rv), errorCode);

    CHECK_RELEASE(" FreeLibrary", FreeLibrary(module), errorCode);

        return errorCode;
}

Завершающий этап можно разделить на:

  1. Деинициализацию библиотеки с помощью функции C_Finalize.

  2. Выгрузку библиотеки из памяти процесса через функцию FreeLibrary (для Linux-систем имеется обертка).

Классификация функций PKCS#11

Стандартные функции и функции расширения

В общем виде все функции внутри PKCS#11-библиотек можно разделить на:

  • Стандартные — те, что явно описаны в стандарте. Список указателей на эти функции можно получить с помощью функции C_GetFunctionList, хранящейся в этой же библиотеке. Сами же стандартные функции имеют префикс «C_».

  • Расширения — те, что были добавлены разработчиками библиотеки и не описаны в стандарте. Стандарт явно не определяет функцию для получения списка расширенных функций. Но в библиотеке rtpkcs11ecp этой функцией является C_EX_GetFunctionListExtended. Сами же функции-расширения обычно имеют префикс «C_EX_».

Описание стандартных функций можно найти в документации PKCS#11. Про то, как работать с расширениями — надо смотреть у разработчиков конкретных библиотек. Например, у нас для этого есть отдельная страница на портале документации.

Разделение по предназначению

С другой стороны, функции PKCS#11 можно классифицировать по их предназначению. Логично выделить следующие виды функций:

  • Функции общего назначения. Например, для получения списка функций или получения информации о библиотеке.

  • Функции работы со слотами. Они не зависят от контекста работы с токеном. Например, C_GetSlotInfo, C_GetTokenInfo и т.п.

  • Функции для работы с сессиями. Как уже говорилось ранее, обычно во время выполнения этих функций осуществляется основное взаимодействие с токеном. При выполнении функции внутри сессии контекст работы с токеном не теряется. Самый простой пример этих функций: функция аутентификации (C_Login), функции работы с закрытым ключом на токене (C_Sign, C_Encrypt) и т.п.

Атомарные и составные операции

Некоторые операции в PKCS#11 работают привычным для нас образом: вызвал функцию — получил результат. Но есть и операции, реализация которых выстроена через многократный вызов функций. Ярким примером такой операции является блочное шифрование: чтобы зашифровать данные нужно вызвать функции: C_EncryptInit, C_EncryptUpdate, C_EncryptFinal. Пример этого будет приведен ниже. Эта особенность связана с тем, что внутри библиотеки PKCS#11 скрыт вызов APDU-команд, который как раз предусматривает разбиение некоторых команд на несколько итераций. Как уже говорилось ранее, это способствует эффективному использованию PKCS#11 с потоками данных.

Работа со слотами

Слоты — это виртуальные устройства библиотеки для подключения токенов и смарт-карт. PKCS#11 предоставляет функции для получения списка слотов и ожидания изменения состояний слотов. Также с помощью специальных функций можно получать информацию о состоянии слота, например, наличие токена в нем, информация о подключенном токене и т.п. Давайте подробнее рассмотрим функции по работе со слотами.

Получение списка слотов

Одна из самых важных операций, которую мы будем использовать в 99 процентах случаев — это получение списка активных слотов. Для этого в PKCS#11 есть функция C_GetSlotList. Примером ее использования является функция get_slot_list, определенная ниже:

int get_slot_list(CK_SLOT_ID_PTR* slots_ptr, CK_ULONG_PTR slotCount)
{
    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Получить количество слотов c подключенными токенами                    *
    *************************************************************************/
    rv = functionList->C_GetSlotList(CK_TRUE, NULL_PTR, slotCount);
    CHECK_AND_LOG(" C_GetSlotList (number of slots)", rv == CKR_OK, rvToStr(rv), exit);

    CHECK_AND_LOG(" Checking available tokens", *slotCount > 0, " No tokens available", exit);

    /*************************************************************************
    * Получить список слотов c подключенными токенами                        *
    *************************************************************************/
    *slots_ptr = (CK_SLOT_ID_PTR)malloc(*slotCount * sizeof(CK_SLOT_ID));
    CHECK(" Memory allocation for slots", *slots_ptr != NULL_PTR, exit);

    rv = functionList->C_GetSlotList(CK_TRUE, *slots_ptr, slotCount);
    CHECK_AND_LOG(" C_GetSlotList", rv == CKR_OK, rvToStr(rv), free_slots);
    printf(" Slots available: %dn", (int)*slotCount);

    /*************************************************************************
    * Выставить признак успешного завершения программы                       *
    *************************************************************************/
    errorCode = 0;

free_slots:
    if (errorCode)
    {
        free(*slots_ptr);
    }

exit:
    return errorCode;
}

Первый вызов функции C_GetSlotList позволяет получить количество доступных слотов. Это позволяет в дальнейшем выделять память под необходимое количество слотов. Второй вызов позволяет получить список слотов.

Первым аргументом C_GetSlotList является флаг, говорящий библиотеке, возвращать ли только слоты с подключенными устройствами (CK_TRUE) или нет (CK_FALSE).

Мониторинг событий слотов и получение информации о слоте

Тем не менее, хоть функция C_GetSlotList и является самой часто используемой, она неудобна при написании приложений, которые хотят динамически следить за состоянием слотов. Особенно это может быть критично при написании многопоточных приложений. На помощь может прийти функция мониторинга событий слотов C_WaitForSlotEvent. Она прерывает свою работу при любом изменении состояния какого-либо слота и возвращает идентификатор измененного слота. Работа с этой функцией выглядит примерно следующим образом:

int monitor_slot_event()
{
    int errorCode = 0;

    while (1) {
        CK_SLOT_ID slot ;
            CK_RV rv = functionList->C_WaitForSlotEvent(0, &slot, NULL_PTR);

        if (CKR_CRYPTOKI_NOT_INITIALIZED == rv) break; // Индикатор того, что PKCS#11 деинициализирована из памяти.
        CHECK_RELEASE_AND_LOG(" C_WaitForSlotEvent", rv == CKR_OK, rvToStr(rv), errorCode);
        if (errorCode)
            break;

        CK_SLOT_INFO slotInfo;
        rv = functionList->C_GetSlotInfo(slot, &slotInfo); // получение информации о слоте

        if (CKR_CRYPTOKI_NOT_INITIALIZED == rv) break; // Индикатор того, что PKCS#11 деинициализирована из памяти.
        CHECK_RELEASE_AND_LOG(" C_GetSlotInfo", rv == CKR_OK, rvToStr(rv), errorCode);
        if (errorCode)
            break;

        if (CKF_TOKEN_PRESENT & slotInfo.flags) { 
                    token_inserted(slot);
        }
    }
}

Как можно заметить, функция отлавливает помимо событий подключения и извлечения токена и смарт-карты, еще и событие деинициализации библиотеки PKCS#11 (код возврата CKR_CRYPTOKI_NOT_INITIALIZED). Данная особенность позволяет использовать эту функцию внутри многопоточных приложений без дополнительной возни с обработкой событий при завершении работы приложения.

Первым аргументом в функцию C_WaitForSlotEvent передается флаг блокировки (CKF_DONT_BLOCK). Если он установлен, то функция не является блокирующей. В таком случае, если никакой слот не был изменен, то возвращается код CKR_NO_EVENT.

Также стоит обратить внимание на использование функции получения информации о слоте C_GetSlotInfo. Мы использовали ее для определения наличия токена по флагу CKF_TOKEN_PRESENT. Подробнее с этой структурой можно ознакомиться здесь.

В этом файле представлен пример получения информации о подключенных токенах или смарт-картах с помощью функции C_GetTokenInfo. С помощью этой функции можно получить серийный номер, метку и другие характеристики подключенного устройства.

Объекты

Всё есть объект — это почти про PKCS#11.

Теперь начнём знакомство с PKCS#11-объектами. А чтобы закрепить материал по функциям, будем рассматривать множество примеров с их использованием. Поскольку одним из самых важных объектов, которые обычно хранятся на токене или смарт-карте является ключевая пара, мы начнём знакомство с объектами через генерацию ключевой пары.

Создание объектов — на примере генерации ключевых пар

В первую очередь, напишем функцию, которая будет генерировать ключевую пару ГОСТ Р 34.10-2012 256 бит на указанном слоте:

int gen_gost_key_pair(CK_SESSION_HANDLE session)
{
    CK_KEY_TYPE keyTypeGostR3410_2012_256 = CKK_GOSTR3410;
    CK_BYTE keyPairIdGost2012_256[] = { "GOST R 34.10-2012 (256 bits) sample key pair ID (Aktiv Co.)" };
    CK_BYTE parametersGostR3410_2012_256[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
    CK_BYTE parametersGostR3411_2012_256[] = { 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
    CK_BBOOL attributeTrue = CK_TRUE;
    CK_BBOOL attributeFalse = CK_FALSE;

    CK_OBJECT_CLASS publicKeyObject = CKO_PUBLIC_KEY;

    CK_ATTRIBUTE publicKeyTemplate[] =
    {
        { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject)},                                        // Класс - открытый ключ
        { CKA_ID, &keyPairIdGost2012_256, sizeof(keyPairIdGost2012_256) - 1 },                          // Идентификатор ключевой пары (должен совпадать у открытого и закрытого ключей)
        { CKA_KEY_TYPE, &keyTypeGostR3410_2012_256, sizeof(keyTypeGostR3410_2012_256) },                // Тип ключа - ГОСТ Р 34.10-2012(256)
        { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)},                                            // Ключ является объектом токена
        { CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse)},                                        // Ключ доступен без аутентификации на токене
        { CKA_GOSTR3410_PARAMS, parametersGostR3410_2012_256, sizeof(parametersGostR3410_2012_256) },   // Параметры алгоритма ГОСТ Р 34.10-2012(256)
        { CKA_GOSTR3411_PARAMS, parametersGostR3411_2012_256, sizeof(parametersGostR3411_2012_256) }    // Параметры алгоритма ГОСТ Р 34.11-2012(256)
    };

    CK_OBJECT_CLASS privateKeyObject = CKO_PRIVATE_KEY;

    CK_ATTRIBUTE privateKeyTemplate[] =
    {
        { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)},                                      // Класс - закрытый ключ
        { CKA_ID, &keyPairIdGost2012_256, sizeof(keyPairIdGost2012_256) - 1 },                          // Идентификатор ключевой пары (должен совпадать у открытого и закрытого ключей)
        { CKA_KEY_TYPE, &keyTypeGostR3410_2012_256, sizeof(keyTypeGostR3410_2012_256) },                // Тип ключа - ГОСТ Р 34.10-2012(256)
        { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)},                                            // Ключ является объектом токена
        { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue)},                                          // Ключ доступен только после аутентификации на токене
        { CKA_GOSTR3410_PARAMS, parametersGostR3410_2012_256, sizeof(parametersGostR3410_2012_256) },   // Параметры алгоритма ГОСТ Р 34.10-2012(256)
        { CKA_GOSTR3411_PARAMS, parametersGostR3411_2012_256, sizeof(parametersGostR3411_2012_256) }    // Параметры алгоритма ГОСТ Р 34.11-2012(256)
    };

    CK_OBJECT_HANDLE privateKey;                      // Хэндл закрытого ключа ГОСТ (ключевая пара для подписи и шифрования)    
    CK_OBJECT_HANDLE publicKey;                       // Хэндл открытого ключа ГОСТ (ключевая пара для подписи и шифрования)    

    CK_MECHANISM gostR3410_2012_256KeyPairGenMech = { CKM_GOSTR3410_KEY_PAIR_GEN, NULL_PTR, 0 };

    CK_RV rv;   
    int errorCode = 1;

    /*************************************************************************
    * Генерация ключевой пары на токене                                      *
    *************************************************************************/
    rv = functionList->C_GenerateKeyPair(session, &gostR3410_2012_256KeyPairGenMech, 
    publicKeyTemplate, arraysize(publicKeyTemplate),
    privateKeyTemplate, arraysize(privateKeyTemplate),
    &publicKey, &privateKey);
    CHECK_AND_LOG(" C_GenerateKeyPair", rv == CKR_OK, rvToStr(rv), exit);

    errorCode = 0;
    printf("Gost key pair generated successfullyn");

exit:
    return errorCode;
}

В этом примере для нас много нового. Можно заметить, что здесь вызывается всего одна функция C_GenerateKeyPair. Эта функция является стандартной функцией генерации ключей, работающей внутри открытой сессии. Также стоит отметить, что пользователь должен быть аутентифицирован перед вызовом этой функции.

Теперь перейдём к объектам. Внутри функции gen_gost_key_pair происходит создание двух объектов на токене: открытого и закрытого ключей. Вот, что стандарт PKCS#11 говорит про объекты:

Cryptoki recognizes a number of classes of objects, as defined in the CK_OBJECT_CLASS data type. An object consists of a set of attributes, each of which has a given value. Each attribute that an object possesses has precisely one value.

То есть стандарт не даёт явное определение объекта, но из того, что там написано, мы знаем:

  • объект относится к определенному классу;

  • объект состоит из множества атрибутов, имеющих заданное значение;

  • каждый атрибут имеет ровно одно значение.

Также в стандарте представлена классификация объектов:

Иерархия PKCS#11 объектов

Иерархия PKCS#11 объектов

Заголовок диаграммы определяет класс объекта, а то что ниже — некоторые из его атрибутов.
Видно, что объектом может являться некоторый механизм (о механизмах мы поговорим позже), встроенные функции токена (Hardware feature), некоторые данные на токене (Storage). В нашем случае мы выполнили действие с данными.

Название всех атрибутов начинается с префикса «CKA_». Одним из самых важных атрибутов является CKA_ID. Он задаёт идентификатор объекта и используется для связи ключевых пар и сертификатов. Атрибут CKA_TOKEN является булевым и показывает, является ли объект — объектом токена. Атрибут CKA_PRIVATE тоже является булевым и определяет нужна ли предварительная аутентификация для получения доступа к объекту. Атрибут CKA_ID — задаёт шестнадцатеричный идентификатор объекта. Также есть булевые атрибуты CKA_MODIFIABLE, CKA_COPYABLE, CKA_DESTROYABLE для более тонкой настройки доступа к объекту. Подробнее про возможные атрибуты конкретных классов объектов можно прочитать непосредственно в самом стандарте для каждого класса объектов.

Объекты данных могут быть самыми разнообразными: асимметричные ключи, симметричные ключи, сертификаты, просто какая-либо информация на токене. В нашем примере мы создали два объекта, но сделали это неявно с помощью механизма генерации ключей. C_GenerateKeyPair приняла на вход механизм генерации ключевой пары, шаблоны открытого и закрытого ключа и с помощью механизма сгенерировала объекты ключевой пары (publicKey и privateKey). Мы пока ещё не описывали механизмы, но, говоря простым языком, механизм — это идентификатор операции, которая выполняет какую-то криптографическую функцию. В нашем случае — это функция генерации объекта.

Поиск объектов и создание сырой подписи

В прошлом разделе мы сгенерировали ключевую пару. На этот раз будем считать, что у нас нет хендлов на сгенерированные ключи, но мы знаем их идентификатор – CKA_ID. Попробуем найти объект закрытого ключа на токене:

int findObjects(CK_SESSION_HANDLE session,         // Хэндл открытой сессии
                CK_ATTRIBUTE_PTR attributes,       // Массив с шаблоном для поиска
                CK_ULONG attrCount,                // Количество атрибутов в массиве поиска
                CK_OBJECT_HANDLE objects[],        // Массив для записи найденных объектов
                CK_ULONG* objectsCount             // Количество найденных объектов
                       )
{
    CK_RV rv;                                           // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
    int errorCode = 1;                                  // Флаг ошибки

    /*************************************************************************
    * Инициализировать операцию поиска                                       *
    *************************************************************************/
    rv = functionList->C_FindObjectsInit(session, attributes, attrCount);
    CHECK_AND_LOG("  C_FindObjectsInit", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Найти все объекты, соответствующие критериям поиска                    *
    *************************************************************************/

    rv = functionList->C_FindObjects(session, objects, *objectsCount, objectsCount);
    CHECK_AND_LOG("  C_FindObjects", rv == CKR_OK, rvToStr(rv), find_final);

    errorCode = 0;

    /*************************************************************************
    * Деинициализировать операцию поиска                                     *
    *************************************************************************/
find_final:
    rv = functionList->C_FindObjectsFinal(session);
    CHECK_RELEASE_AND_LOG("  C_FindObjectsFinal", rv == CKR_OK, rvToStr(rv), errorCode);

exit:
    return errorCode;
}

int find_private_key(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE_PTR privateKey)
{
        CK_BYTE keyPairIdGost2012_256[] = { "GOST R 34.10-2012 (256 bits) sample key pair ID (Aktiv Co.)" };
        CK_OBJECT_CLASS privateKeyObject = CKO_PRIVATE_KEY;

        CK_ATTRIBUTE privateKeyTemplate[] =
        {
                { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)},              // Класс - закрытый ключ
                { CKA_ID, &keyPairIdGost2012_256, sizeof(keyPairIdGost2012_256) - 1},   // Идентификатор ключевой пары (должен совпадать у открытого и закрытого ключей)
        };

        CK_ULONG cnt = 1;

        CK_RV rv;
        int errorCode = 1;

        rv = findObjects(session, privateKeyTemplate,
        arraysize(privateKeyTemplate), privateKey, &cnt);

        CHECK(" findObjects", rv == 0, exit);
        CHECK_AND_LOG(" Checking number of keys found", cnt == 1, "No objects foundn", exit);

        errorCode = 0;
exit:
        return errorCode;
}

Данный пример иллюстрирует работу с функцией поиска объекта по заданным атрибутам. Как можно заметить, операция поиска объекта на токене является составной и работа с ней сводится как минимум к вызову трёх функций: C_FindObjectsInit, C_FindObjects, C_FindObjectsFinal. Функция C_FindObjects может вызываться по несколько раз, и каждый раз она будет возвращать следующие объекты поиска. Предпоследний аргумент функции C_FindObjects задаёт размер выходного массива объектов. А последний — количество полученных объектов после очередного поиска.

Поиск приватного ключа производился по атрибуту его класса и идентификатору. Мы рассчитывали, что найдётся хотя бы один объект по заданному шаблону и брали любой из них. Используем найденный ключ для вычисления сырой подписи:

int sign(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE privateKey)
{    
    /* OID алгоритма хеширования ГОСТ Р 34.11-2012(256)                     */
    CK_BYTE parametersGostR3411_256[] = {0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02};

    /* Механизм подписи/проверки подписи по алгоритму ГОСТ Р 34.10-2012(256) и хешированием по алгоритму ГОСТ Р 34.11-2012(256) */
    CK_MECHANISM gost3410SignWith3411Mech = { CKM_GOSTR3410_WITH_GOSTR3411_12_256, ¶metersGostR3411_256, sizeof(parametersGostR3411_256)};

    CK_BYTE data[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
               0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
               0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
               0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

    CK_BYTE_PTR signature;                            // Указатель на буфер, содержащий цифровую подпись для данных
    CK_ULONG signatureSize;                           // Размер буфера, содержащего цифровую подпись для данных, в байтах

    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Вычислить подпись от данных                                            *
    *************************************************************************/
    printf(" Signing data...n");

    /*************************************************************************
    * Инициализировать операцию подписи данных                               *
    *************************************************************************/
    rv = functionList->C_SignInit(session, &gost3410SignWith3411Mech, privateKey);
    CHECK_AND_LOG("  >C_SignInit", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Определить размер данных подписи                                       *
    *************************************************************************/
    rv = functionList->C_Sign(session, data, sizeof(data), NULL_PTR, &signatureSize);
    CHECK_AND_LOG("  C_Sign(get size)", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Подписать данные                                                       *
    *************************************************************************/

    signature = (CK_BYTE*)malloc(signatureSize * sizeof(CK_BYTE));
    CHECK("  Memory allocation for signature", signature != NULL, exit);

    rv = functionList->C_Sign(session, data, sizeof(data), signature, &signatureSize);
    CHECK_AND_LOG("  C_Sign (signing)", rv == CKR_OK, rvToStr(rv), free_signature);


    /*************************************************************************
    * Распечатать буфер, содержащий подпись                                  *
    *************************************************************************/
    printf("  Signature buffer is: n");
    printHex(signature, signatureSize);
    printf("Data has been signed successfully.n");

    errorCode = 0;

free_signature:
    free(signature);
exit:
    return errorCode;
}

В этом примере подпись и хеш можно считать одновременно. Такой вариант рекомендован для безопасности: цепочку «хеширование-подпись» лучше не «разрывать». Чтобы показать, какой алгоритм хеширования использовать, мы передали его OID.

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

Работа с функциями расширения на примере создания запроса на сертификат

Пришло время показать, как работать с функциями-расширениями. Сделаем это на примере библиотеки PKCS#11 от Рутокен и создадим запрос на сертификат для нашей ключевой пары. Генерация запроса на сертификат не описана в стандарте, поэтому сделаем это через функцию-расширение C_EX_CreateCSR.

int create_csr(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE publicKey, CK_OBJECT_HANDLE privateKey)
{
    /*************************************************************************
    * Запрос на получение сертификата                                        *
    *************************************************************************/
    /*************************************************************************
    * Список полей DN (Distinguished Name)                                   *
    *************************************************************************/
    CK_CHAR_PTR dn[] = { (CK_CHAR_PTR)"CN",                   // Тип поля CN (Common Name)
                     (CK_CHAR_PTR)"UTF8String:Иванов",        // Значение
                     (CK_CHAR_PTR)"C",                        // C (Country)
                     (CK_CHAR_PTR)"RU",
                     (CK_CHAR_PTR)"2.5.4.5",                  // SN (Serial Number)
                     (CK_CHAR_PTR)"12312312312",
                     (CK_CHAR_PTR)"1.2.840.113549.1.9.1",     // E (E-mail)
                     (CK_CHAR_PTR)"ivanov@mail.ru",
                     (CK_CHAR_PTR)"ST",                       // ST (State or province)
                     (CK_CHAR_PTR)"UTF8String:Москва",
                     (CK_CHAR_PTR)"O",                        // O (Organization)
                     (CK_CHAR_PTR)"CompanyName",
                     (CK_CHAR_PTR)"OU",                       // OU (Organizational Unit)
                     (CK_CHAR_PTR)"Devel",
                     (CK_CHAR_PTR)"L",                        // L (Locality)
                     (CK_CHAR_PTR)"Moscow", };

    /*************************************************************************
    * Список дополнительных полей                                            *
    *************************************************************************/
    CK_CHAR_PTR exts[] = {(CK_CHAR_PTR)"keyUsage",                                                        // Использование ключа
                      (CK_CHAR_PTR)"digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment",
                      (CK_CHAR_PTR)"extendedKeyUsage",                                                    // Дополнительное использование
                      (CK_CHAR_PTR)"1.2.643.2.2.34.6,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4",
                      (CK_CHAR_PTR)"2.5.29.17",                                                           // Дополнительное имя (пример с кодированием в виде DER)
                      (CK_CHAR_PTR)"DER:30:0F:81:0D:65:78:61:6d:70:6c:65:40:79:61:2E:72:75",
                      (CK_CHAR_PTR)"2.5.29.32",                                                           // Политики сертификата (кодирование в виде DER с пометкой "critical")
                      (CK_CHAR_PTR)"critical,DER:30:0A:30:08:06:06:2A:85:03:64:71:01",
                      (CK_CHAR_PTR)"1.2.643.100.111",                                                     // Средства электронной подписи владельца
                      (CK_CHAR_PTR)"ASN1:UTF8String:СКЗИ "Рутокен ЭЦП 2.0"", };

    CK_BYTE_PTR csr;                                   // Указатель на буфер, содержащий подписанный запрос на сертификат
    CK_ULONG csrSize;                                  // Размер запроса на сертификат в байтах

    char* csrPem;                                      // Строка с CSR в формате PEM

    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Создать запрос на сертификат                                           *
    *************************************************************************/
    printf("nCreating CSR...n");

    /*************************************************************************
    * Создание запроса на сертификат                                         *
    *************************************************************************/
    rv = functionListEx->C_EX_CreateCSR(session, publicKey, dn, arraysize(dn), &csr, &csrSize, privateKey, NULL_PTR, 0, exts, arraysize(exts));
    CHECK_AND_LOG(" C_EX_CreateCSR", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Сконвертировать и распечатать буфер в формате PEM                      *
    *************************************************************************/
    GetCSRAsPEM(csr, csrSize, &csrPem);
    CHECK(" Get CSR in PEM format", csrPem != NULL, free_csr);

    printf("nCertificate request is:n");
    printf("%sn", csrPem);

    errorCode = 0;
    printf("Creating CSR has been completed successfully.n");
free_csr_pem:
    free(csrPem);
free_csr:
    rv = functionListEx->C_EX_FreeBuffer(csr);
    CHECK_RELEASE_AND_LOG(" C_EX_FreeBuffer", rv == CKR_OK, rvToStr(rv), errorCode);
exit:
    return errorCode;
}

Можно заметить, что работа с функциями расширения очень похожа на работу со стандартными функциями. Основное отличие лишь в том, что мы обращаемся к другому списку функций CK_FUNCTION_LIST_EXTENDED_PTR. Создание запроса на сертификат происходит в одну строчку функцией C_EX_CreateCSR и возвращает запрос в DER-формате. Также стоит обратить внимание, что память, выделенную внутри библиотеки, следует высвобождать с помощью функции C_EX_FreeBuffer.

По полученному запросу можно получить сертификат в Удостоверяющем центре. Например, воспользуемся тестовым УЦ КриптоПро для получения сертификата. Полученный сертификат необходимо скачать в DER-формате, сохранить в файле с именем «cert_2012-256.cer» и положить в директорию, из которой вы запускаете примеры. Полученный сертификат можно импортировать на токен.

Импорт сертификата на токен. Создание объекта вручную

Сертификаты на токене так же как и ключи — являются объектами. Сертификат можно импортировать на токен, создав объект с нужными атрибутами. Для этого мы реализовали функцию: import_cert:

int import_cert(CK_SESSION_HANDLE session)
{
    CK_OBJECT_CLASS certificateObject = CKO_CERTIFICATE;
    CK_BYTE keyPairIdGost2012_256[] = { "GOST R 34.10-2012 (256 bits) sample key pair ID (Aktiv Co.)" };
    CK_BBOOL attributeTrue = CK_TRUE;
    CK_BBOOL attributeFalse = CK_FALSE;
    CK_CERTIFICATE_TYPE certificateType = CKC_X_509;
    CK_ULONG tokenUserCertificate = 1;

    /*************************************************************************
    * Шаблон для импорта сертификата                                         *
    *************************************************************************/
    CK_ATTRIBUTE certificateTemplate[] =
    {
        { CKA_VALUE, 0, 0 },                                                               // Значение сертификата (заполняется в процессе работы)
        { CKA_CLASS, &certificateObject, sizeof(certificateObject) },                      // Класс - сертификат
        { CKA_ID, &keyPairIdGost2012_256, sizeof(keyPairIdGost2012_256) - 1 },             // Идентификатор сертификата (совпадает с идентификатором соответствующего ключа)
        { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue) },                              // Сертификат является объектом токена
        { CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse) },                          // Сертификат доступен без аутентификации
        { CKA_CERTIFICATE_TYPE, &certificateType, sizeof(certificateType) },               // Тип сертификата - X.509
        { CKA_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate) }, // Категория сертификата - пользовательский
    };

    FILE* certFile;                                   // Поток ввода сертификата
    CK_BYTE_PTR certDer;                              // Массив с сертификатом в DER формате
    CK_ULONG certSize;                                // Размер массива сертификата

    CK_OBJECT_HANDLE certificate;                     // Хэндл сертификата

    CK_RV rv;
    int r;
    int errorCode = 1;                                // Флаг ошибки

    /*************************************************************************
    * Открыть поточный ввод сертификата из файла                             *
    *************************************************************************/
    certFile = fopen("cert_2012-256.cer", "rb");
    CHECK_AND_LOG(" fopen", certFile != NULL, ""cert_2012-256.cer" doesn't exist", exit);

    /*************************************************************************
    * Определить размер файла, содержащего сертификат                        *
    *************************************************************************/
    r = fseek(certFile, 0, SEEK_END);
    CHECK(" fseek", r == 0, close_certFile);
    certSize = ftell(certFile);
    CHECK(" ftell", certSize > 0, close_certFile);
    r = fseek(certFile, 0, SEEK_SET);
    CHECK(" fseek", r == 0, close_certFile);

    /*************************************************************************
    * Выделить память для сертификата                                        *
    *************************************************************************/
    certDer = (CK_BYTE_PTR)malloc(certSize);
    CHECK(" malloc", certDer != NULL, close_certFile);

    /*************************************************************************
    * Прочитать сертификат                                                   *
    *************************************************************************/
    r = (int)fread(certDer, 1, (int)certSize, certFile);
    CHECK(" fread", r == (int)certSize, free_certificate);

    /*************************************************************************
    * Задать шаблон сертификата для импорта                                  *
    *************************************************************************/
    certificateTemplate[0].pValue = certDer;
    certificateTemplate[0].ulValueLen = certSize;

    /*************************************************************************
    * Создать сертификат на токене                                         *
    *************************************************************************/
    rv = functionList->C_CreateObject(session, certificateTemplate, arraysize(certificateTemplate), &certificate);
    CHECK_AND_LOG(" C_CreateObject", rv == CKR_OK, rvToStr(rv), free_certificate);

    errorCode = 0;
    printf("Certificate has been created successfullyn");


    /*************************************************************************
    * Очистить память из-под строки с сертификатом                           *
    *************************************************************************/
free_certificate:
    free(certDer);

    /*************************************************************************
    * Закрыть поток ввода сертификата                                        *
    *************************************************************************/
close_certFile:
    r = fclose(certFile);
    CHECK_RELEASE(" fclose", r == 0, errorCode);

exit:
    return errorCode;
}

На этот раз мы создали объект напрямую с помощью функции C_CreateObject. Для создания объекта сертификата мы аналогично передали шаблон с атрибутами объекта: тело сертификата, идентификатор, тип доступа, тип сертификата и т.п.

Функцию C_CreateObject можно использовать не только для создания сертификата на токене, но и для создания других объектов, например, публичных ключей (CKO_PUBLIC_KEY), закрытых ключей (CKO_PRIVATE_KEY), симметричных ключей (CKO_SECRET_KEY), обычных данных (CKO_DATA). Их значение будет также содержаться внутри атрибута CKA_VALUE.

Теперь, когда у нас на токене имеется и ключевая пара и сертификат, для закрепления материала рассмотрим операцию создания CMS-подписи.

Формирование CMS-подписи

Данная возможность является расширением библиотеки Рутокен и может работать только с ГОСТ-ключами. Для создания подписи в формате CMS требуется наличие закрытого ключа и сертификата (неявно содержащего в себе открытый ключ). Создание CMS-подписи реализовано в функции sign_cms:

int sign_cms(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE certificate, CK_OBJECT_HANDLE privateKey)
{
    /*************************************************************************
    * Данные для подписи                                                     *
    *************************************************************************/
    CK_BYTE data[] =
    {
        0x01, 0x00, 0x02, 0x35, 0x35,
        0x02, 0x00, 0x01, 0x01,
        0x81, 0x00, 0x09, 0x34, 0x30, 0x34, 0x34, 0x34, 0x35, 0x39, 0x39, 0x38,
        0x82, 0x00, 0x0A, 0x37, 0x37, 0x38, 0x31, 0x35, 0x36, 0x34, 0x36, 0x31, 0x31,
        0x83, 0x00, 0x13, 0x41, 0x6B, 0x74, 0x69, 0x76, 0x20, 0x52, 0x75, 0x74, 0x6F, 0x6B, 0x65, 0x6E, 0x20, 0x42, 0x61, 0x6E, 0x6B, 0x2E,
        0x84, 0x00, 0x14, 0x34, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x37, 0x36,
        0x85, 0x00, 0x0A, 0x33, 0x32, 0x32, 0x38, 0x37, 0x33, 0x36, 0x37, 0x36, 0x35,
        0x86, 0x00, 0x03, 0x52, 0x55, 0x42,
        0xFF, 0x00, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
    };

    CK_BYTE_PTR signature;                             // Указатель на буфер, содержащий подпись исходных данных
    CK_ULONG signatureSize;                            // Размер буфера, содержащего подпись исходных данных, в байтах
    char* signaturePem;                                // Строка с CMS в формате PEM

    CK_RV rv;
    int errorCode = 1;                                 // Флаг ошибки

    /*************************************************************************
    * Подписать данные                                                       *
    *************************************************************************/
    rv = functionListEx->C_EX_PKCS7Sign(session, data, sizeof(data), certificate,
        &signature, &signatureSize, privateKey, NULL_PTR, 0, USE_HARDWARE_HASH);
    CHECK_AND_LOG(" C_EX_PKCS7Sign", rv == CKR_OK, rvToStr(rv), exit);

        /*************************************************************************
        * Сконвертировать и распечатать буфер в формате PEM                      *
        *************************************************************************/
        GetCMSAsPEM(signature, signatureSize, &signaturePem);
        CHECK(" Get CMS in PEM format", signaturePem != NULL, free_signature);

        printf("nSignature is:n");
        printf("%sn", signaturePem);


    errorCode = 0;
    printf("Data has been signed successfully.n");

free_signature_pem:
    free(signaturePem);

    /*************************************************************************
    * Освободить память, выделенную в библиотеке                             *
    *************************************************************************/
free_signature:
    rv = functionListEx->C_EX_FreeBuffer(signature);
    CHECK_RELEASE_AND_LOG(" C_EX_FreeBuffer", rv == CKR_OK, rvToStr(rv), errorCode);

exit:
    return errorCode;
}

Создание CMS-подписи произошло вызовом всего лишь одной функции расширения C_EX_PKCS7Sign. А объект сертификата нашелся так же просто, как и объект ключа с минимальными отличиями в коде. Все это показывает, как просто и лаконично (по меркам языка C) спроектирован стандарт PKCS#11 с идеей объектного подхода.

Получение и установка атрибутов публичных объектов

В завершение главы про объекты хотелось бы отметить, что атрибуты публичных объектов можно получать и изменять. Делается это с помощью функций C_SetAttributeValue и C_GetAttributeValue.

Логика работы с функцией C_SetAttributeValue очень похожа на логику создания объектов — создаётся шаблон, атрибуты заполняются указанными значениями. Все это передаётся на вход функции C_SetAttributeValue. Изменять атрибуты можно, если у объекта атрибут CKA_MODIFIABLE равен CK_TRUE.

При получении значений атрибутов иногда неизвестно, какой будет выходной размер атрибута. В таком случае создается шаблон с нулевыми значениями указателей на выходные объекта атрибутов и их размеров. Этот шаблон передаётся функции C_GetAttributeValue. Функция заполняет значение выходных размеров атрибутов в этом шаблоне. Мы может воспользоваться этой информацией для выделения памяти под атрибуты в шаблоне и дальнейшего вызова функции C_GetAttributeValue.

Для демонстрации работы функций C_GetAttributeValue и C_SetAttributeValue рассмотрим пример получения тела сертификата и изменения текстовой метки сертификата:

int get_cert(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE cert)
{
    CK_BYTE_PTR body = NULL_PTR;
    CK_ATTRIBUTE template[] = {
        {CKA_VALUE, NULL_PTR, 0}
    };

    char* certPem;

    CK_RV rv;
    int errorCode=1;

        /*************************************************************************
        * Получение размера тела сертификата                                     *
        *************************************************************************/
    rv = functionList->C_GetAttributeValue(session, cert, template, arraysize(template));
    CHECK_AND_LOG(" C_GetAttributeValue", rv == CKR_OK, rvToStr(rv), exit);

    body = (CK_BYTE_PTR) malloc(template[0].ulValueLen);
    template[0].pValue = body;

        /*************************************************************************
        * Получение тела сертификата в формате DER                               *
        *************************************************************************/
    rv = functionList->C_GetAttributeValue(session, cert, template, arraysize(template));
    CHECK_AND_LOG(" C_GetAttributeValue", rv == CKR_OK, rvToStr(rv), free);

        /*************************************************************************
        * Сконвертировать и распечатать буфер в формате PEM                      *
        *************************************************************************/
        GetCertAsPem(body, template[0].ulValueLen, &certPem);
        CHECK(" Get cert in PEM format", certPem != NULL, free);

        printf("nCertificate request is:n");
        printf("%sn", certPem);

    errorCode = 0;
        printf("Getting cert body has been completed successfully.n");

free_cert_pem:
        free(certPem);
free:
    free(body);
exit:
    return errorCode;
}

int set_cert_label(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE cert)
{
    CK_UTF8CHAR label[] = {"GOST certificate"};

    CK_ATTRIBUTE template[] = {
        CKA_LABEL, label, sizeof(label)-1
    };

    CK_RV rv;
    int errorCode = 1;

        /*************************************************************************
        * Установка метки сертификата                                            *
        *************************************************************************/
    rv = functionList->C_SetAttributeValue(session, cert, template, arraysize(template));
    CHECK_AND_LOG(" C_SetAttributeValue", rv == CKR_OK, rvToStr(rv), exit);

    errorCode = 0;

exit:
    return errorCode;
}

Про механизмы

Мы уже ранее встречались с механизмами в примерах и дали краткое описание. Давайте теперь опишем их подробнее. Описание механизмов в PKCS#11 было вынесено в отдельный документ, с которым можно ознакомиться здесь. В этом документе написано:

A mechanism specifies precisely how a certain cryptographic process is to be performed. PKCS #11 implementations MAY use one of more mechanisms defined in this docuоment.

Отсюда следует, что механизмы:

  • Определяют некоторое криптографическое преобразование.

  • PCKS#11 может использовать механизмы, определенные в этом документе.

Более того, некоторые PKCS#11-библиотеки могут использовать и другие механизмы.

Согласно документации механизмы можно разделить на:

  • Механизмы шифрования и расшифрования (Encrypt & Decrypt);

  • Механизмы подписи и проверки подписи (Sign & Verify);

  • Механизм формирования хеша (Digest);

  • Механизм восстановления подписи по публичному ключу (Sign Recover & Verify Recovery);

  • Механизм генерации симметричных и асимметричных ключей (Gen. Key/Key Pair);

  • Экспорт и импорт ключей (Wrap & Unwrap);

  • Выработка общего ключа на основе асимметричных ключей (Derive).

Каждый механизм идентифицирует одну или несколько из этих функций. Так, например, ранее рассмотренный механизм CKM_GOSTR3410_KEY_PAIR_GEN предназначен для генерации ключей, а механизм CKM_AES_ECB может использоваться как для зашифрования/расшифрования, так и для свертки/развертки ключей.

Работа с механизмами, на примере зашифрования сообщения

Механизмы в PKCS#11 задаются через структур CK_MECHANISM. Объекты типа CK_MECHANISM в дальнейшем передаются PKCS#11-функциям для указания нужного механизма. Сама структура CK_MECHANISM состоит из трех элементов:

  1. Идентификатор механизма (mechanism);

  2. Указатель на параметры механизма (pParameter);

  3. Длина в байтах параметров механизма (ulParameterLen).

Самый простой пример параметра механизма — вектор инициализации для алгоритмов шифрования. Попробуем на примере показать, как можно зашифровать сообщение через механизм CKM_GOST28147 с указанным вектором инициализации. Пример реализован внутри функции encrypt_data:

int encrypt_data(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE secretKey)
{
    /* Имитовставка */
    CK_BYTE iv[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f };
    /*  Механизм программного шифрования/расшифрования по алгоритму ГОСТ 28147-89 */
    CK_MECHANISM gost28147EncDecMech = {CKM_GOST28147, iv, sizeof(iv)};

    /*************************************************************************
    * Данные для шифрования                                                  *
    *************************************************************************/
    CK_BYTE data[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                   0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                   0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
                   0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00 };

    CK_BYTE_PTR encrypted;                            // Указатель на временный буфер для зашифрованных данных
    CK_ULONG encryptedSize;                           // Размер временного буфера в байтах

    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Инициализировать операцию шифрования                                   *
    *************************************************************************/
    rv = functionList->C_EncryptInit(session, &gost28147EncDecMech, secretKey);
    CHECK_AND_LOG(" C_EncryptInit", rv == CKR_OK, rvToStr(rv), exit);

    /*************************************************************************
    * Зашифровать данные (при шифровании с использованием механизма          *
    * CKM_GOST28147_ECB размер данных должен быть кратен 8)                  *
    *************************************************************************/
    encryptedSize = sizeof(data);

    encrypted = (CK_BYTE_PTR)malloc(encryptedSize * sizeof(CK_BYTE));
    CHECK("  Memory allocation for encrypted data", encrypted != NULL_PTR, exit);

    rv = functionList->C_Encrypt(session, data, sizeof(data), encrypted, &encryptedSize);
    CHECK_AND_LOG(" C_Encrypt", rv == CKR_OK, rvToStr(rv), free_encrypted);

    /*************************************************************************
    * Распечатать буфер, содержащий зашифрованные данные                     *
    *************************************************************************/
    printf(" Encrypted buffer is:n");
    printHex(encrypted, encryptedSize);

    printf("Encryption has been completed successfully.n");

    errorCode = 0;
free_encrypted:
    free(encrypted);
exit:
    return errorCode;
}

В этом примере стоит обратить внимание на то, как передаётся вектор инициализации механизму шифрования. Стоит заметить, что после вызова функции C_Encrypt вызывать функцию C_EncryptFinal не нужно: для многих механизмов вызов C_Encrypt эквивалентен последовательному вызову функций C_EncryptUpdate и C_EncryptFinal.

Проверка поддержки механизмов

Ранее в примерах мы всегда надеялись на то, что токен поддерживает используемые механизмы, но, вообще говоря, — это может быть не так. Так, например, Рутокен Lite не поддерживает криптографические механизмы. Поэтому перед началом работы с каким-либо механизмом желательно убедиться в том, что он поддерживается устройством. Это можно сделать с помощью функции C_GetMechanismList, которая возвращает список поддерживаемых механизмов токена. Напишем удобную обертку для проверки поддержки определенного механизма:

int mech_supports(CK_SLOT_ID slot, CK_MECHANISM_TYPE mech, int* mechIsSupported)
{
    CK_MECHANISM_TYPE_PTR mechanisms;                 // Массив поддерживаемых механизмов
    CK_ULONG mechanismCount;                          // Количество поддерживаемых механизмов

    CK_RV rv;
    int errorCode = 1;

    /*************************************************************************
    * Получить список поддерживаемых токеном механизмов                      *
    *************************************************************************/
    rv = functionList->C_GetMechanismList(slot, NULL_PTR, &mechanismCount);
    CHECK_AND_LOG(" C_GetMechanismList (number of mechanisms)", rv == CKR_OK, rvToStr(rv), exit);

    CHECK_AND_LOG(" Checking mechanisms available", mechanismCount > 0, " No mechanisms available", exit);

    mechanisms = (CK_MECHANISM_TYPE_PTR)malloc(mechanismCount * sizeof(CK_MECHANISM_TYPE));
    CHECK(" Memory allocation for mechanisms", mechanisms != NULL_PTR, exit);

    rv = functionList->C_GetMechanismList(slot, mechanisms, &mechanismCount);
    CHECK_AND_LOG(" C_GetMechanismList", rv == CKR_OK, rvToStr(rv), free_mechanisms);

    /*************************************************************************
    * Определение поддерживаемых токеном механизмов                          *
    *************************************************************************/
    for (size_t i = 0; i < mechanismCount; ++i) {
        if (mechanisms[i] == mech) {
            *mechIsSupported = 1;
            break;
        }
    }

    errorCode = 0;
    if (*mechIsSupported)
        printf("Mechanism is supportedn");
    else
        printf("Mechanism is not supportedn");

free_mechanisms:
    free(mechanisms);
exit:
}

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

Утилита pkcs11-tool

Часто бывает необходимо просто и быстро выполнить какое-либо обращение к PKCS#11-библиотеке, не прибегая к написанию кода. На помощь может прийти утилита pkcs11-tool, которая распространяется в составе пакета (opensc)[https://github.com/OpenSC/OpenSC].

Утилита pkcs11-tool может гибко выполнять огромное количество стандартных PKCS#11-операций. Например:

  • Генерация ключевых пар:
    pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B --id 45 -l

  • Создание сырой подписи:
    pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --sign --id 45 -l -i file.txt --mechanism GOSTR3410-WITH-GOSTR3411-12-256

  • Генерация псевдослучайных последовательностей:
    pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --generate-random 16

  • Получение списка объектов на токене:
    pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O

  • Получение механизмов, поддерживаемых токеном:
    pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -M

Список не является исчерпывающим, более подробно о полных возможностях утилиты можно прочитать в мануале.

Дополнительный материал

Если вы захотите узнать, как работать с более специфичными функциями, то большое количество примеров по работе с PKCS#11 можно найти в нашем SDK. Все примеры по работе с PKCS#11-библиотекой находятся в директории sdkpkcs11samples.

Выводы

Зачастую библиотека PKCS#11 является основным кирпичиком при написании приложений или других библиотек для работы со смарт-картами на других языках программирования. Поэтому знание основ работы с PKCS#11 на языке C может помочь разобраться с тем, как работать с обертками или как лучше реализовать архитектуру новой обертки.

Кроме PKCS#11 с объектами на смарт-картах/токенах можно работать через:

  • OpenSSL API (pkcs11 engine, rutoken engine);

  • C# для .NET Framework 4.5, .NET Standard 2.0, MonoAndroid 2.3, Xamarin.iOS 1.0 и Xamarin.Mac 2.0;

  • CryptoAPI;

  • Java c JDK 8 или новее через интерфейсы PKCS#11-wrapper и JCA;

  • C++ с использованием библиотеки pki-core;

  • JavaScript для большинства популярных браузеров с использованием Рутокен Плагин;

Если вы хотите узнать про какую-то реализацию подробнее, то напишите в комментариях и мы постараемся в ближайшее время выпустить новую статью с её разбором.

Содержание

  1. Ошибки Рутокен
  2. Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
  3. Ошибка: Rutoken перестает определяться (Windows 10)
  4. Ошибка: Панель управления не видит Рутокен ЭЦП 2.0
  5. Почему компьютер не видит носитель рутокен
  6. Первичная диагностика неисправности Рутокен
  7. 1. Повреждение/разлом корпуса или USB-разъема Рутокена
  8. 3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы
  9. 1. Рутокен не определяется в «Панели управления Рутокен»
  10. 2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:
  11. 2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”
  12. 2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”
  13. 2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”
  14. 2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20
  15. 2.5 Референсные данные не найдены
  16. 2.6 «PIN-код заблокирован»
  17. 1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”
  18. 2. Проверка целостности сертификата с неизвлекаемыми ключами
  19. Почему компьютер не видит носитель рутокен
  20. Почему компьютер не видит рутокен
  21. Установка драйвера для Windows Vista Windows Seven
  22. Установка драйвера для Windows XP
  23. Подготовка
  24. Установка драйверов и модулей ruToken
  25. Настройка считывателя в КриптоПро
  26. Установка сертификатов
  27. Почему не виден сертификат ЭЦП на носителе
  28. Причина 1: драйвер не установлен или устройство отображается в диспетчере устройств с восклицательным знаком
  29. Причина 2: долгое опознание носителя на Windows 7
  30. Причина 3: USB-порт работает некорректно
  31. Причина 4: носитель неисправен
  32. Почему выходит ошибка при создании подписи
  33. Устранение ошибки ненайденного элемента ЭЦП
  34. Устранение ошибки с построением цепочки сертификатов

Ошибки Рутокен

Из нашей статьи вы узнаете:

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

Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва

Ошибку можно заметить на вкладке «Сертификаты» непосредственно в панели управления Рутокен. Проблема возникает во время установки ЭЦП и связана с неполной настройкой. Речь про отсутствие специального корневого доверенного сертификата, который выдает удостоверяющий центр.

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

Если в открывшемся дереве вы видите лишь ваш личный сертификат, то надо установить еще один, который был выдан в удостоверяющем центре, и сделать доверенным.

Ошибка: Rutoken перестает определяться (Windows 10)

Потенциально могут возникать периодические ошибки из-за недоступности сертификатов, невозможности запустить панель управления. Одновременно светодиод на токене горит, а сам Рутокен имеется в Диспетчере устройств. Подобная ситуация может быть связана со спецификой работы материнской платы компьютера, когда при переходе из энергосберегающего режима в штатный не происходит «пробуждения» токена. Выходом здесь станет его отключение либо повторное подключение Рутокена (для этого достаточно достать USB-токен из разъема и подключить опять).

В случае если ошибка не исчезла, обратитесь за консультацией в удостоверяющий центр, где вы оформили ЭЦП и приобрели Рутокен.

Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

Для решения проблемы выполните следующие действия:

Если ничего не помогло и ошибка осталась, обращайтесь в удостоверяющий центр «Астрал». Мы предлагаем услуги по генерации ЭЦП любых типов на выгодных условиях, а также комплексное техническое сопровождение. Для решения проблем мы готовы проконсультировать по телефону либо найти выход с помощью удаленного подключения к вашему компьютеру. Получить дополнительную информацию можно по телефону либо оставив заявку на сайте. Мы оперативно ответим и предоставим консультацию.

Источник

Почему компьютер не видит носитель рутокен

Рутокен при подключении к компьютеру не отображается в Панели управления Рутокен, кнопка «Ввести PIN-код» неактивна.

image2018 5 8 14 29 34

Если используется Подключение к удаленному рабочему столу, подробную информацию можно прочитать в этой статье.

Определите модель Рутокен по маркировке на самом ключе, воспользовавшись этой инструкцией.

Возможно, не хватает питания для Рутокена. Попробуйте подключить Рутокен в другой USB-порт.

Если используется удлинитель, подключите Рутокен напрямую.

Проверьте работают ли флешки, другие токены или смарт-карты.

Модель Рутокен S должна отображаться в разделе Контроллеры USB.

image2018 5 8 14 53 13

Модели Рутокен ЭЦП 2.0, Рутокен Lite должны отображаться в разделе Устройства чтения смарт-карт.

*Иногда могут отображаться как «USB Smart Card reader», «Rutoken ECP» или «Rutoken Lite»

image2018 5 8 14 52 26

Откройте Панель управления Рутокен и перейдите на вкладку Настройки.

Проверьте значение в раскрывающемся списке Количество считывателей Рутокен S. Если установлен «0», то увеличьте это значение до 1 и примените изменения

image2018 5 8 14 56 13

Если на другом компьютере Рутокен так же не определяется, скорее всего, он вышел из строя. Обратитесь в компанию, где приобретался Рутокен для его замены.

Источник

Первичная диагностика неисправности Рутокен

В соответствии с правилами эксплуатации и хранения электронных идентификаторов Рутокен, пользователь имеет право бесплатно заменить неисправный носитель Рутокен в течение срока гарантийного обслуживания, если, в ходе проведения экспертизы, случай будет признан гарантийным.

Отправка токена на экспертизу производится через ту компанию, с которой у компании «Актив» имеются договорные отношения.

Таким образом, если вы приобретали Рутокен у одного из наших партнеров, вам нужно передать Рутокен партнеру. Если договор между вашей организацией и компанией «Актив» напрямую не заключался, и вы направите Рутокен нам, мы не сможем принять его на экспертизу.

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

В случае обнаружения пользователем неисправности Рутокена, советуем провести первичную диагностику носителя, прежде чем обратиться в компанию, где приобретался носитель Рутокен.

Самые частые ошибки мы собрали в этой статье.

Первичная диагностика состоит из 3 этапов:

При первичном осмотре Рутокена выявляются механические повреждения, при которых носитель не подлежит замене.

Можно выделить следующие виды механических повреждений:

1. Повреждение/разлом корпуса или USB-разъема Рутокена

image2020 4 17 15 35 9 image2020 4 17 15 34 16

image2020 4 17 15 32 7

3. Рутокен со следами оплавления и/или почернения корпуса изнутри носителя, отпаявшаяся микросхема или вспученная поверхность микросхемы

image2020 4 17 16 55 37 image2020 4 17 16 56 4

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

Если при визуальном осмотре Рутокена никаких видимых повреждений не выявлено, необходимо проверить Рутокен на компьютере.

Подключите Рутокен к компьютеру и запустите «Панель управления Рутокен».

Запуск панели управления Рутокен выполняется через меню Пуск / Панель управления / Панель управления Рутокен.

image2020 4 17 17 4 50

Если Рутокен определяется в «Панели управления Рутокен», активна кнопка «Ввести PIN-код…»

Нажмите на кнопку «Информация» на вкладке «Администрирование». Ошибок возникать не должно.

Попробуйте авторизоваться с PIN-кодом пользователя и/или администратора.

Если при нажатии на кнопку «Информация» ошибок не возникает, а авторизация выполняется успешно, следует перейти к третьему этапу диагностики носителя Рутокен

(Рутокен работает корректно, необходимо проверить целостность ключевой информации на Рутокене).

После подключения Рутокена к компьютеру возможны следующие ошибки в Панели управления Рутокен:

1. Рутокен не определяется в «Панели управления Рутокен»

image2020 4 17 17 5 41

Рутокен не определяется в «Панели управления Рутокен» (список «Подключенные Рутокен» пустой) и, как следствие, неактивны кнопки «Ввести PIN-код…» и «Информация…». В данном случае необходимо воспользоваться инструкцией.

2. Рутокен определяется панелью управления, кнопка «Ввести PIN-код…» активна, но авторизация с PIN-кодом пользователя/администратора выполняется с ошибкой. Дальнейшие действия зависят от формулировки возникающей ошибки:

2.1 Ошибка “Не удалось получить всю информацию о токене Код ошибки: 0x6a82 Описание ошибки: Файл/ RSF не найден”

Oshibka

Подключите Рутокен к другому USB порту. Повторите попытку ввода PIN-кода. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.2 Ошибка “Не удалось получить всю информацию о токене код ошибки: 0х6400 Описание ошибки: Состояние памяти Rutoken не изменилось”

6400

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.3 Ошибка “Не удалось получить всю информацию о токене Код ошибки 0xF003 Описание ошибки Неверное значение”

F003

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

2.4 Ошибка «Обнаружено повреждение системной области памяти (ошибка CRC)» код ошибки 0x6F20

image2020 4 17 17 8 59

Ошибка означает, что память на носителя Рутокен была повреждена. Форматирование Рутокена не поможет. Рутокен необходимо передать в ту компанию, в которой приобретался данный носитель для отправки на экспертизу в компанию Актив.

2.5 Референсные данные не найдены

image001

Подключите Рутокен к другому USB порту. Повторите попытку ввести PIN-код. По возможности, установите Драйверы Рутокен на другой компьютер, подключите токен и попробуйте ввести PIN-код.

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

Более подробная информация об ошибке есть в статье нашей Базы Знаний.

2.6 «PIN-код заблокирован»

image2020 4 17 17 9 17

Ошибка «PIN-код заблокирован» означает, что Рутокен был заблокирован в результате превышения количества попыток ввода PIN-кода.

Если заблокирован PIN-код пользователя, воспользуйтесь инструкцией.

Если заблокирован PIN-код Администратора, воспользуйтесь инструкцией.

На третьем этапе проверяется целостность ключевой информации, которая содержится на Рутокене.

Определите модель Рутокена по инструкции.

Если используется носитель из семейства Рутокен ЭЦП, проверьте формат ключей по инструкции.

1. Проверка целостности контейнера с сертификатом “КриптоПро CSP” или “VipNet CSP”

Выполнить такую проверку можно через программу криптопровайдера, с помощью которой была сгенерирована электронная подпись пользователя, например программа «КриптоПро CSP» или «VipNet CSP»

Тестирование целостности контейнера через «КриптоПро CSP» необходимо проводить по инструкции.

Тестирование целостности контейнера через «VipNet CSP» необходимо проводить по инструкции.

Если операция по проверке ключевого контейнера выполняется без ошибок, значит ключевая информация на носителе Рутокен не повреждена.

2. Проверка целостности сертификата с неизвлекаемыми ключами

Тестирование носителей Рутокен ЭЦП 2.0 с записанными на него неизвлекаемыми ключами ЭП (PKCS#11) пользователями самостоятельно не производится. Удаленная диагностика выполняется сотрудниками технической поддержки компании Актив.

Источник

Почему компьютер не видит носитель рутокен

После прохождения проверки условий подключения по сертификату ключа проверки ЭЦП и выбора сертификата в личном кабинете юридического лица на сайте nalog.ru через Yandex браузер возникает одно из двух сообщений:

«Не удается обнаружить токен или смарт-карту. Подключите Рутокен в любой USB-порт компьютера или к картридеру» или «На Рутокене нет сертификатов. Для доступа к сайту запишите на Рутокен сертификат«.

image2019 9 5 16 7 19 image2019 9 5 16 8 6

Эти ошибки возникают в приложении Рутокен Коннект, установленном на компьютер, если не выполняются условия для успешного входа или выбран неверный вариант входа.

Необходимо определить нужно ли расширение Рутокен Коннект и какой вариант входа нужно использовать.

Расширение Рутокен Коннект должно использоваться для входа на сайт nalog.ru только если используется модель Рутокен ЭЦП 2.0 с записанным на него сертификатом формата PKCS#11 (как для ЕГАИС).

Проверка условий подключения должна завершиться успешно.

2. Если используется другая модель Рутокен и/или на Рутокене содержится сертификат формата «КриптоПро CSP», то выбран правильный вариант:

нужно выполнить одно из трех действий:

a) Удалите адрес lkul.nalog.ru:443 из настроек Рутокен Коннект

image2019 9 5 17 32 40

image2019 9 5 17 37 4

b) Или удалите Адаптер Рутокен Коннект

image2019 9 5 17 41 56

с) Или удалите приложение Рутокен Коннект

image2019 9 5 18 2 17

После выполнения одного из трех действий повторите Проверку условий подключения по сертификату ЭЦП.

Источник

Почему компьютер не видит рутокен

1. Возможно, на токене перегорел светодиод (лампочка). Для проверки следует:

5469

2. Подключить Rutoken к другому USB-порту.

3. Запустить / перезапустить службу «Смарт-карта». Для этого:

4. Переустановить драйвер Rutoken, предварительно отключив носитель от компьютера.
Для этого открыть меню «Пуск» > «Панель управления» > «Установка и удаление программ» (для ОС Windows Vista Windows Seven меню «Пуск» > «Панель управления» > «Программы и компоненты»). В списке найти пункт «Rutoken Drivers» и выбрать «Удалить». После удаления необходимо перезагрузить компьютер и установить драйвер Rutoken заново.

5. В случае, если переустановка драйвера не помогла решить ошибку, необходимо установить драйвер с помощью меню «Диспетчер устройств». Порядок установки зависит от используемой операционной системы. Ниже приведены настройки для:

Установка драйвера для Windows Vista Windows Seven

1. Кликнуть по значку «Мой компьютер» правой кнопкой мыши и выбрать элемент «Свойства».

2. В открывшемся меню выбрать «Диспетчер устройств».

picture 1502

3. В открывшемся окне проверить, нет ли в списке элемента «Другие устройства», обозначенного желтым значком.

picture 826

4. Необходимо выделить строку «ruToken» и выбрать «Обновить драйверы».

picture 827

5. Далее выбрать «Выполнить поиск драйверов на этом компьютере».

picture 828

6. Нажать на кнопку «Обзор», указать каталог C:WindowsSystem32Aktiv Co и нажать на кнопку «Далее». Указанный каталог может быть скрытым. В таком случае необходимо выбрать меню «Сервис» > «Параметры папок» > «Вид», установить переключатель «Показывать скрытые файлы, папки и диски» и повторить выбор каталога.

picture 829

7. Дождаться окончания установки и нажать на кнопку «Закрыть».

picture 830

8. После установки драйвера устройство будет отображаться в разделе «Контроллеры USB». На токене также должен загореться диод.

picture 831

Установка драйвера для Windows XP

1. Кликнуть по значку «Мой компьютер» правой кнопкой мыши и выбрать элемент «Свойства».

2. В окне «Свойства системы» перейти на вкладку «Оборудование» и нажать на кнопку «Диспетчер устройств».

picture 832

3. В открывшемся окне проверить, нет ли в списке элемента «ruToken» (либо «Неизвестное устройство»), обозначенного желтым значком. Необходимо кликнуть по нему правой кнопкой мыши и выбрать «Обновить драйвер».

picture 833

4. В окне «Мастер обновления оборудования» установить переключатель «Установка из указанного места».

picture 834

5. В открывшемся окне нажать на кнопку «Обзор», указать путь к каталогу C:Windowssystem32Aktiv Co
t USB и нажать на кнопку «Далее». Указанный каталог может быть скрытым. В таком случае необходимо выбрать меню «Сервис» > «Параметры папок» > «Вид», установить переключатель «Показывать скрытые файлы, папки и диски» и повторить выбор каталога

picture 835

6. Дождаться окончания установки и нажать на кнопку «Готово».

picture 836

7. По завершении установки драйвера устройство будет отображаться в разделе «Контроллеры универсальной последовательной шины USB». На токене также должен загореться диод.

picture 837

6. В случае если выполнение инструкций не помогло исправить ошибку, токен, скорее всего, неисправен. Чтобы в этом убедиться, следует присоединить Rutoken к компьютеру, на котором никогда не устанавливался драйвер. Если носитель работает корректно, то должен запуститься «Мастер установки нового оборудования». Если при присоединении рутокена ничего не происходит, то носитель, вероятнее всего, неисправен, и его необходимо сменить.

Если сохранилась копия сертификата, следует использовать ее для работы в системе Контур.Экстерн, предварительно установив сертификат. Если копий не сохранилось, необходимо обратиться в сервисный центр для незапланированной замены ключа.

%D0%9C%D0%B0%D1%80%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 %D0%BE%D0%B1%D1%89 206%D1%8577 11.18

%D0%91%D0%B0%D0%BD%D0%BD%D0%B5%D1%80 216%D1%8590 11.10.17

vk 180

Подготовка

Установка драйверов и модулей ruToken

Для установки драйверов необходимо:

Настройка считывателя в КриптоПро

Откроется окно со списком установленных считывателей. Если в списке нет считывателя Все считыватели смарт-карт, нажмите кнопку «Добавить»

Если кнопка «Добавить» не активна, то нужно перейти на вкладку «Общие» и нажать на ссылку «Запустить с правами администратора».
RU 3.6 2.0

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

В следующем окне выберите считыватель Все считыватели смарт-карт и нажмите кнопку «Далее»
RU 3.6 3.0

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

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

Для того, чтобы система стала запрашивать ruToken при входе, с него нужно установить сертификат. Чтобы узнать, как это сделать, перейдите по данной ссылке (нажмите здесь чтобы перейти).

Иногда при работе с электронной цифровой подписью (ЭЦП) выходит ошибка о том, что ПК не видит сертификат подписи на носителе или о том, что при создании подписи была допущена ошибка. Причина может быть в неустановленном или переставшем работать драйвере, в неисправности токена или в неисправности программной части компьютера.

rabota za kompyuterom

Почему не виден сертификат ЭЦП на носителе

Обычно проблема решается простой перезагрузкой компьютера и объясняется сбоем в работе программных компонентов. Но иногда для исправления ошибки нужно переустановить драйвера или обратиться в службу технической поддержки пользователей.

Причина 1: драйвер не установлен или устройство отображается в диспетчере устройств с восклицательным знаком

Если на носителе Рутокен ЭЦП не найдено ни одного сертификата, а в диспетчере устройств носитель отображается с восклицательным знаком, то проблема кроется в драйвере.

Для исправления ситуации нужно извлечь носитель ЭЦП из компьютера и скачать последнюю версию драйвера. Скачивание нужно производить только с официальных ресурсов:

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

Причина 2: долгое опознание носителя на Windows 7

При работе в ОС Windows 7 драйверы могут долго назначаться. Решение проблемы — дождитесь окончания процесса или обновите версию ОС.

Причина 3: USB-порт работает некорректно

Убедитесь, что проблема в USB-порте, а не в носителе ЭЦП, для этого переключите токен к другому порту. Если носитель определился системой, то перезагрузите ПК. Обычно это помогает справиться с проблемой и запустить работу всех USB-портов. Если перезагрузка не помогла, то желательно обратиться в техническую поддержку для устранения неисправности.

sertifikat jeup ne viden na nositele

Причина 4: носитель неисправен

Если при переключении носителя к другому ПК или USB-порту флешку компьютер не видит, то проблема в носителе. Чтобы устранить неисправность, обратитесь в сервисный центр для выпуска нового токена.

Почему выходит ошибка при создании подписи

Ошибка создания подписи обычно имеет в расшифровке два значения:

Неисправность работы подписи связана с некорректной работой криптопровайдера, неустановленными или необновленными сертификатами.

Решение проблемы зависит от типа ошибки и обычно не требует обращения в техническую поддержку.

Устранение ошибки ненайденного элемента ЭЦП

Переустановите криптопровайдер на неисправном ПК с официального портала КриптоПро (https://www.cryptopro.ru/downloads). После этого очистите кэш и временные файлы в используемом браузере, а также кэш Java. Затем удалите личные сертификаты и сертификаты главного удостоверяющего центра. Используйте КриптоПро и заново установите новые в соответствии с именем контейнера. После установки корневых сертификатов:

Если после проделанной работы ошибка сохраняется, то нужно обратиться в сервисный центр.

Устранение ошибки с построением цепочки сертификатов

Обычно ошибку вызывает отсутствие сертификатов доверенных корневых центров. Чтобы устранить неисправность, нужно открыть список сертификатов и найти проблемный. Он будет иметь отметку о проблеме в проверке отношений:

rundll 1

Затем пользователь скачивает с официальной страницы сертификат Минкомсвязи РФ и сертификат удостоверяющего центра, имеющего проблемы в работе. Устанавливают их в раздел «‎Корневые сертификаты»‎, а пошаговый процесс выглядит так:

В нужном сертификате нажать «‎Установить».

error 02

В мастере импорта сертификатов нажать «‎Далее» и в новом окне поставить галочку напротив «‎Поместить все сертификаты в следующем хранилище». Нажать «‎Обзор».

error 03

В открывшемся списке выбрать «‎Доверенные корневые центры» и нажать последовательно «‎ОК» и «‎Далее».

error 04

Нажать «‎Готово», а затем подтвердить установку.

error 05

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

Ошибки в работе носителя электронной подписи могут быть вызваны как неисправностью самого носителя, так и неисправностями в программном обеспечении. Перезагрузите ПК и переключите токен в другой порт, чтобы убедиться в его исправности. Если проблема вызвана тем, что токен поврежден, то необходимо обратиться в сервисный центр компании, выпустившей USB. При ошибке, возникающей во время подписания документа, нужно убедиться в корректной работе всех сертификатов и криптопровайдера и при необходимости провести их полную переустановку.

Источник

вопросы

Из нашей статьи вы узнаете:

Помимо открытого и закрытого ключа электронной подписи, в ЕГАИС пользователю понадобится RSA-ключ. Он защищает соединение между пользователем и информационной системой. Генерируется на сайте egais.ru. Случается, что при его создании возникает ошибка: «Вставьте смарт-карту» или «Подключите смарт-карту».

Расскажем пошагово, как убрать ошибки Рутокен: Вставьте смарт-карту или Подключите смарт-карту на примере Рутокен ЭЦП 2.0.

Описание ошибок Рутокен

Если при генерации уведомление сообщает, что смарт-карту нужно вставить, текст ошибки содержит следующее:

«Обнаружена смарт-карта, но она не может использоваться для текущей операции. Возможно, для используемой смарт-карты нет драйвера или сертификата»


смарт-карта1

Если предлагается выбрать устройство чтения смарт-карт, то в описании изложен данный текст:

«Подключите смарт-карту. Выберите устройство чтения смарт-карт. Смарт-карта не может выполнить запрошенную операцию либо операция требует другой смарт-карты».


Подключите смарт-карту2

Чтобы решить проблему, необходимо проверить настройки и выполнить определённые действия.

Решение ошибки Рутокен: Вставьте или подключите смарт-карту

Чтобы решить проблему, необходимо сделать следующее:

  1. Включить поддержку ЕГАИС на Рутокен.
  2. Удалить следы RSA-ключей.
  3. Проверить Диспетчер устройств на наличие ошибки 28.
  4. Удалить Единый клиент JaCarta.
  5. Переназначить криптопровайдер.
  6. Переустановить минидрайвер.

Далее подробное описание действий по каждому пункту.

Включение поддержки ЕГАИС на Рутокен

В настройках Рутокен ЭЦП 2.0 должен быть выбран и активирован криптопровайдер Microsoft Base Smart Card Crypto Provider.

Для этого необходимо:

  • Открыть меню «Пуск». Перейти в «Настройки», далее «Панель управления» и «Панель управления Рутокен».
  • Во вкладке «Настройки», в поле «Настройки криптопровайдера» нажать «Настроить криптопровайдер».
  • 
«Настройки»3

  • В окне «Настройки криптопровайдера» напротив «Семейство Рутокен ЭЦП» выбрать «Microsoft Base Smart Card Provider».
  • 
«Семейство Рутокен ЭЦП»4

  • Нажать «ОК», чтобы сохранить изменения.

Удаление следов RSA-ключей

При предыдущей неудачной попытке генерации RSA-ключа носитель Рутокен может содержать его следы. Чтобы решить проблему, в первую очередь нужно скачать архив DeleteRSA1.0.3.1.zip.

Далее пользователь должен:

  • Разархивировать содержимое.
  • Убедиться, что на компьютере не установлены другие ключи Рутокен, кроме проблемного.
  • Запустить утилиту DeleteRSA1.0.3.1.zip. Программа удалит все RSA-ключи. После этого она автоматически закроется.
  • Выполнить новую генерацию RSA-ключа.

Важно! Представленную утилиту нельзя включать, если на компьютере установлен криптопровайдер Валидата CSP. Если другого ПК нет, то перед запуском необходимо экспортировать файл сертификата ГОСТ, а после работы утилиты импортировать сертификат обратно на Рутокен.

Проверка Диспетчера устройств на наличие ошибки 28

Чтобы установить наличие ошибки, нужно перейти в «Диспетчер устройств». В разделе «Другие устройства» проверить наличие «Смарт-карта», которая содержит ошибку «Для устройства не установлены драйверы (Код 28)».


«Диспетчер устройств»5

Чтобы решить проблему, нужно назначить драйвер смарт-карте:

  1. Нажать правой кнопкой мыши на «Смарт-карта».
  2. Выбрать «Обновить драйверы».
  3. 
«Обновить драйверы»6

  4. Далее нажать «Выполнить поиск драйверов на этом компьютере (Поиск и установка драйверов вручную)».
  5. 
Выполнить поиск7

  6. Нажать на «Выбрать драйвер из списка уже установленных драйверов».
  7. 
Выбрать драйвер8

  8. Выбрать «Фильтр смарт-карт» и нажать два раза «Далее», потом «Да».
  9. 
смарт-карт9

    
«Далее»10

    
«Да»11

  10. Пользователь получит уведомление по завершению операции. Нажать «Закрыть».
  11. 
«Закрыть»12

После данных действий необходимо произвести попытку генерации RSA-ключа.

Удаление Единого клиента JaCarta

Установленный на ПК «Единый Клиент JaCarta» может внести изменения в настройках криптопровайдера. В связи с этим и появляется некорректная генерация RSA-сертификата для Рутокен ЭЦП 2.0. Для решения проблемы нужно удалить данный компонент. А после генерации RSA-ключа можно установить его заново.

Переназначение криптопровайдера

Переназначение криптопровайдера осуществляется в программе «Панель управления Рутокен». Требуется выполнить следующее:

  • Во вкладке «Настройки», в разделе «Настройки криптопровайдера» нажать «Настройка».
  • 
«Настройки»13

  • Напротив Рутокен ЭЦП (2.0 / PKI / BT) выбрать любой криптопровайдер, кроме «Microsoft Base Smart Card Crypto Provider». Например, «Aktiv ruToken CSP v1.0» или «CryptoPRO CSP».
  • Нажать «Применить».
  • 
«Применить»14

  • После этого поставить обратно «Microsoft Base Smart Card Crypto Provider» и нажать «Применить».
  • 
«Применить»15

После этого можно попробовать сгенерировать новый RSA-сертификат.

Переустановка минидрайвера

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

  1. Открыть «Диспетчер устройств» и выбрать раздел «Смарт-карта».
  2. Удалить строку «Aktiv Co. Rutoken Minidriver». Если строки с таким названием нет, она может отображаться как «Неизвестная смарт-карта».
  3. 
«Неизвестная смарт-карта»16

  4. Потом перейти во вкладку «Действие» и нажать «Обновить конфигурацию оборудования».
  5. 
«Действие»17

Если предложенные способы решения не помогли, следует обратиться в службу технической поддержки ЕГАИС.


Offline

Chetoxs

 


#1
Оставлено
:

23 декабря 2022 г. 17:01:15(UTC)

Chetoxs

Статус: Новичок

Группы: Участники

Зарегистрирован: 23.12.2022(UTC)
Сообщений: 4

Добрый день, не отображается Рутокен Лайт в программе КриптоПро 5.0
Apple M1 Pro Ventura 13.0.1
Мигает огонек на устройстве и все
информация из терминала —
Last login: Fri Dec 23 16:45:54 on ttys000
chetoxs@MacBook-Pro-Anton-2 ~ % pcsctest

MUSCLE PC/SC Lite Test Program

Testing SCardEstablishContext : Command successful.
Testing SCardGetStatusChange
Please insert a working reader : 1
1


Вверх


Offline

nickm

 


#2
Оставлено
:

23 декабря 2022 г. 17:30:46(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 1,033

Сказал(а) «Спасибо»: 305 раз
Поблагодарили: 162 раз в 149 постах

Цитата:

Что важно знать про PKCS#11
Это не приложение, не библиотека и не часть операционной системы. Это просто описание интерфейса встраивания. Если производитель устройства хочет, чтобы его устройство встроили в какое-то приложение, использующее PKCS#11, он должен разработать собственную динамическую библиотеку (.dll на Windows или .so на Linux), которая будет реализовывать указанный интерфейс.

Тогда всё, что останется сделать прикладному приложению, — указать правильный путь до переданной библиотеки и использовать её в соответствии с известными спецификациями PKCS#11.

По сути, описанная схема встраивания и использования PKCS#11 полностью аналогична тому, как используется интерфейс CryptoAPI, с помощью которого приложения используют криптопровайдеры.

Главный вывод, который следует из вышеуказанного, — для работы с ключевым носителем через PKCS#11 первым делом нужно установить PKCS#11-библиотеку конкретного производителя:

Для работы с носителями Рутокен нужно поставить Драйверы Рутокен (для Windows) или пакет с соответствующей библиотекой;

Цитата:

Пользователям macOS
Установщик библиотеки rtPKCS11ecp для macOS


Вверх


Offline

Chetoxs

 


#3
Оставлено
:

23 декабря 2022 г. 17:35:29(UTC)

Chetoxs

Статус: Новичок

Группы: Участники

Зарегистрирован: 23.12.2022(UTC)
Сообщений: 4

Ставил, перезагружал, но не помогло


Вверх


Offline

Александр Лавник

 


#4
Оставлено
:

23 декабря 2022 г. 18:41:17(UTC)

Александр Лавник

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,302
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 746 раз в 694 постах

Автор: nickm Перейти к цитате

Цитата:

Что важно знать про PKCS#11
Это не приложение, не библиотека и не часть операционной системы. Это просто описание интерфейса встраивания. Если производитель устройства хочет, чтобы его устройство встроили в какое-то приложение, использующее PKCS#11, он должен разработать собственную динамическую библиотеку (.dll на Windows или .so на Linux), которая будет реализовывать указанный интерфейс.

Тогда всё, что останется сделать прикладному приложению, — указать правильный путь до переданной библиотеки и использовать её в соответствии с известными спецификациями PKCS#11.

По сути, описанная схема встраивания и использования PKCS#11 полностью аналогична тому, как используется интерфейс CryptoAPI, с помощью которого приложения используют криптопровайдеры.

Главный вывод, который следует из вышеуказанного, — для работы с ключевым носителем через PKCS#11 первым делом нужно установить PKCS#11-библиотеку конкретного производителя:

Для работы с носителями Рутокен нужно поставить Драйверы Рутокен (для Windows) или пакет с соответствующей библиотекой;

Цитата:

Пользователям macOS
Установщик библиотеки rtPKCS11ecp для macOS

КриптоПро CSP использует Рутокен Lite как пассивный носитель, поэтому настройки с PKCS#11 здесь ни при чем.

pcsctest не выдает информацию по токену.

Думаю, стоит попробовать установить пакеты из примечания (b) инструкции в нашей базе знаний.

Техническую поддержку оказываем тут
Наша база знаний


Вверх

thanks 1 пользователь поблагодарил Александр Лавник за этот пост.

nickm

оставлено 23.12.2022(UTC)


Offline

Chetoxs

 


#5
Оставлено
:

23 декабря 2022 г. 19:45:55(UTC)

Chetoxs

Статус: Новичок

Группы: Участники

Зарегистрирован: 23.12.2022(UTC)
Сообщений: 4

Спасибо! Устройство теперь видит в разделе контейнеров, но кнопка установить сертификат неактивна, могу выбрать только протестировать контейнер и все


Вверх


Offline

Александр Лавник

 


#6
Оставлено
:

24 декабря 2022 г. 15:54:24(UTC)

Александр Лавник

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,302
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 746 раз в 694 постах

Автор: Chetoxs Перейти к цитате

Спасибо! Устройство теперь видит в разделе контейнеров, но кнопка установить сертификат неактивна, могу выбрать только протестировать контейнер и все

Если внутри ключевого контейнера нет сертификата (в столбце Имя субъекта для выбранного ключевого контейнера пусто), то для установки сертификата нужно выполнить:

Инструменты КриптоПро
Сертификаты
Установить сертификаты
выбрать файл сертификата (обычно с расширением .cer или .crt)

По вопросу получения файла сертификата вам надо обращаться в удостоверяющий центр, в котором вам записывали ключевой контейнер на токен.

Техническую поддержку оказываем тут
Наша база знаний


Вверх


Offline

Chetoxs

 


#7
Оставлено
:

26 декабря 2022 г. 11:50:16(UTC)

Chetoxs

Статус: Новичок

Группы: Участники

Зарегистрирован: 23.12.2022(UTC)
Сообщений: 4

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


Вверх

Пользователи, просматривающие эту тему

Guest

Перейти
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Понравилась статья? Поделить с друзьями:
  • Pjlsw 8586 ошибка h e
  • Pixma mp495 ошибка p08
  • Pixma mp250 ошибка e13
  • Piron пароконвектомат ошибки
  • Pipenv install requests ошибка