Сертификат ненадежен рутокен как исправить

Skip to end of metadata

  • Created by , last modified on Dec 27, 2017

Go to start of metadata

“Сертификат ненадежен”/”Не удалось проверить статус отзыва”

Описание

В “Панели управления Рутокен” на вкладке “Сертификаты” возникает ошибка “Сертификат ненадежен”/”Не удалось проверить статус отзыва”

Причина

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

Решение

Для решения сложившейся ситуации рекомендуем вам обновить драйверы до последней версии (в новых версиях драйверов Рутокен можно установить доверенный корневой сертификат средствами “Панели управления Рутокен”): http://www.rutoken.ru/support/download/drivers-for-windows/

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

Откройте “Панель управления Рутокен” – вкладка “Сертификаты” – выделите сертификат и нажмите кнопку “Свойства”

Выберите вкладку “Путь сертификации” 

  • Если в дереве “Путь сертификации” есть только ваш сертификат, вам необходимо обращаться в удостоверяющий центр, выдавший вам сертификат электронной подписи для получения доверенного корневого сертификата.
  • Если в дереве “Путь сертификации” помимо сертификата, выданного на вашу организацию, есть один (или несколько) сертификатов, с сообщением об ошибке, выполните указанные ниже действия:

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

    1) Откройте “Пуск” – (“Настройки”) – “Панель управления” – “КриптоПро CSP” – вкладка “Сервис” – “Просмотреть сертификаты в контейнере” – “Обзор” – выбираем сертификат – “ОК” – “Далее” – “Свойства” – вкладка “Путь сертификации” – выделяем сертификат с ошибкой – “Просмотр сертификата” – “Установить сертификат” – “Далее” – ставим флаг “Поместить все сертификаты в следующее хранилище” – “Обзор” – “Доверенные корневые центры сертификации” – “ОК” – “Далее” – “Готово” – “ОК”

       

     

    P.S.: Если кнопка “Установить сертификат” отсутствует, сохраните  сертификат на компьютер по этой инструкции, после чего продолжайте помещение сертификата в “Доверенные корневые центры сертификации”, запустив полученный файл с компьютера.

        

    Для того, чтобы информация о сертификатах обновилась, необходимо перезапустить “Панель управления Рутокен” или нажать кнопку обновления 

    После выполнения указанных действий в “Панели управления Рутокен” – вкладке “Сертификаты” сертификат должен отображаться как действительный.

Сертификат ненадежен

В панели управления рутокен может отображаться неприятная запись «Сертификат ненадежен»

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

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

В результате установки нужного сертификата цепочка выстроится правильно:

Теперь сертификат действителен!

rutoken ecp touch fsb

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

Содержание статьи

  • 1 Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
  • 2 Ошибка: Rutoken перестает определяться (Windows 10)
  • 3 Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

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

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

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

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

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

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

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

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

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

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

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

Нажмите на звезду, чтобы оценить!

Прочитали: 1 141

Содержание

  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. Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе
  2. Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе
  3. Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе
  4. Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
  5. Ошибка: Rutoken перестает определяться (Windows 10)
  6. Ошибка: Панель управления не видит Рутокен ЭЦП 2.0
  7. Причина
  8. Решение
  9. Ошибка 5 отказано в доступе Windows 10
  10. Windows 10 Системная ошибка 5
  11. «Ошибка 5. Отказано в доступе» – причины возникновения и способы устранения
  12. Что собой представляет системная ошибка 5
  13. Почему возникает «System Error Code 5. Отказано в доступе»
  14. Исправление «Ошибки 5: отказано в доступе» в Windows 7
  15. Способ 1: Запуск от имени администратора
  16. Способ 2: Доступ к папке
  17. Способ 3: Учетные записи пользователей
  18. Задать вопрос
  19. Согласие на обработку персональных данных
  20. СОГЛАСИЕ на обработку персональных данных
  21. Способ 1: Запуск с привилегиями администратора
  22. Способ 2: Открытие доступа к каталогам
  23. Способ 3: «Командная строка»
  24. Способ 4: Устранение проблем с Виндовс
  25. Заключение

Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе

При установке или удалении/драйверов Рутокен возникает ошибка: «Код ошибки 5: Отказано в доступе» или «0x80070005 — Отказано в доступе».

RD1007 > 2.PNG» data-location=»База знаний > RD1007 > 2.PNG» data-image-height=»440″ data-image-width=»636″>

RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-location=»База знаний > RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-image-height=»187″ data-image-width=»368″>

Проверьте установлен ли на вашем компьютере антивирус 360 Total Security.

При установке Драйверов Рутокен антивирус 360 Total Security запрашивает разрешение на установку.

Если разрешение не будет получено, установка драйвера заканчивается ошибкой: «0x80070005 — Отказано в доступе». После возникновения этой ошибки, антивирус больше не даст установить этот файл.

1) Запустите Утилиту удаления Драйверов Рутокен, чтобы очистить систему от предыдущих неудачных установок

2) Если после окончания работы утилита попросит перезагрузить компьютер, сделайте это

3) Установите Драйверы Рутокен в зависимости от разрядности вашего компьютера:

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

При необходимости, вы сможете установить «360 Total Security» после успешной установки «Драйверов Рутокен».

RD1007 > image2016-10-26 11:31:35.png» data-location=»База знаний > RD1007 > image2016-10-26 11:31:35.png» data-image-height=»680″ data-image-width=»1015″>

RD1007 > image2016-10-26 11:33:24.png» data-location=»База знаний > RD1007 > image2016-10-26 11:33:24.png» data-image-height=»524″ data-image-width=»551″> RD1007 > image2016-10-26 11:35:42.png» data-location=»База знаний > RD1007 > image2016-10-26 11:35:42.png» data-image-height=»144″ data-image-width=»412″>

RD1007 > image2016-10-26 11:37:7.png» data-location=»База знаний > RD1007 > image2016-10-26 11:37:7.png» data-image-height=»399″ data-image-width=»548″>

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

Программа может иметь различное название — из известных нам: MovieToolbar, Browser Tab Search by Ask, Aztec Media Inc Software Informer. Названия могут быть и другими.

Пока такая вирусная программа не будет найдена — проблему решить не удастся.
Таким образом, нужно выполнять удаление всех подозрительных программ и надстроек стандартным образом (меню «ПускПанель управленияПрограммы и компоненты»).

У текущего пользователя могут отсутствовать права ни установку программ. Установите «Драйверы Рутокен» из-под учетной записи Администратора.

Источник

Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе

При установке или удалении/драйверов Рутокен возникает ошибка: «Код ошибки 5: Отказано в доступе» или «0x80070005 — Отказано в доступе».

Проверьте установлен ли на вашем компьютере антивирус 360 Total Security.

При установке Драйверов Рутокен антивирус 360 Total Security запрашивает разрешение на установку.

Если разрешение не будет получено, установка драйвера заканчивается ошибкой: «0x80070005 — Отказано в доступе». После возникновения этой ошибки, антивирус больше не даст установить этот файл.

1) Запустите Утилиту удаления Драйверов Рутокен, чтобы очистить систему от предыдущих неудачных установок

2) Если после окончания работы утилита попросит перезагрузить компьютер, сделайте это

3) Установите Драйверы Рутокен в зависимости от разрядности вашего компьютера:

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

При необходимости, вы сможете установить «360 Total Security» после успешной установки «Драйверов Рутокен».

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

Программа может иметь различное название — из известных нам: MovieToolbar, Browser Tab Search by Ask, Aztec Media Inc Software Informer. Названия могут быть и другими.

Пока такая вирусная программа не будет найдена — проблему решить не удастся.
Таким образом, нужно выполнять удаление всех подозрительных программ и надстроек стандартным образом (меню «ПускПанель управленияПрограммы и компоненты»).

У текущего пользователя могут отсутствовать права ни установку программ. Установите «Драйверы Рутокен» из-под учетной записи Администратора.

Источник

Драйверы рутокен ошибка код ошибки 5 0x00000005 отказано в доступе

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

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

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

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

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

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

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

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

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

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

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

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

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

    Рутокен код ошибки 5 отказано в доступе «Ошибка 5: отказано в доступе» говорит о том, что у пользователя не хватает прав для запуска какого-либо приложения или программного решения.

    There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. Action Install_Rutoken_Drivers, entry: RTDRVS_Install_Rutoken_Drivers, library: C:WindowsInstallerMSID0C3.tmp

    Причина

    В операционной системе нарушена работоспособность Windows Installer-а

    Решение

    С методами решения других проблем можно ознакомиться на форуме Рутокен

    RD1007 > 2.PNG» data-location=»База знаний > RD1007 > 2.PNG» data-image-height=»440″ data-image-width=»636″>

    RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-location=»База знаний > RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-image-height=»187″ data-image-width=»368″>

    Проверьте установлен ли на вашем компьютере антивирус 360 Total Security.

    При установке Драйверов Рутокен антивирус 360 Total Security запрашивает разрешение на установку.

    1) Запустите Утилиту удаления Драйверов Рутокен, чтобы очистить систему от предыдущих неудачных установок

    2) Если после окончания работы утилита попросит перезагрузить компьютер, сделайте это

    3) Установите Драйверы Рутокен в зависимости от разрядности вашего компьютера:

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

    При необходимости, вы сможете установить «360 Total Security» после успешной установки «Драйверов Рутокен».

    RD1007 > image2016-10-26 11:31:35.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:31:35.jpg» data-image-height=»680″ data-image-width=»1015″>

    RD1007 > image2016-10-26 11:33:24.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:33:24.jpg» data-image-height=»524″ data-image-width=»551″> RD1007 > image2016-10-26 11:35:42.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:35:42.jpg» data-image-height=»144″ data-image-width=»412″>

    RD1007 > image2016-10-26 11:37:7.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:37:7.jpg» data-image-height=»399″ data-image-width=»548″>

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

    У текущего пользователя могут отсутствовать права ни установку программ. Установите «Драйверы Рутокен» из-под учетной записи Администратора.

    Ошибка 5 отказано в доступе Windows 10

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

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

    Чтобы воспользоваться этим вариантом, юзер, не имеющий права доступа, должен иметь пароль одного из людей, находящихся в административной группе и ввести его. После проведения процедуры программа запустится.

    Для разрешения доступа к папке всем пользователям, необходимо выполнить следующие действия:

    Аналогичная процедура делается с такими параметрами, как «Администраторы», «Пользователи», «Система», «TrustedInstaller».

    Windows 10 Системная ошибка 5

    Настройки безопасности нередко выдают эту ошибку. Исправит её можно через реестр операционной системы. Для начала следует выяснить, как называется служба, не желающая запускаться. В списке служб нужно выбрать подходящую и найти строку «Имя службы». Её требуется запомнить и начать работу с реестром. Запуск Редактора реестра производится с помощью окна «Выполнить».

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

    Бывают случаи, когда появляется ошибка Xapofx1 5 dll для Windows 10. Это происходит из-за отсутствия файла Xapofx1 5 dll. Сбой может влиять на процесс запуска игр, установку утилит или обновление драйверов. Такой файл относится к исполнительным библиотекам DLL. Причиной сбоя могут стать пиратские версии игр. Поэтому пользователю рекомендуется применять только лицензионный контент. Для исправления ошибки нужно переустановить систему.

    Нередко пользователи Windows 10 после обновления винды или отдельных программ, например, Microsoft Office сталкиваются с тем, что появляется ошибка 0xc004f074, убрать которую с помощью одного клика по крестику не.

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

    «Ошибка 5. Отказано в доступе» – причины возникновения и способы устранения

    Как устранить ошибку 5 в Windows.

    Что собой представляет системная ошибка 5

    Почему возникает «System Error Code 5. Отказано в доступе»

    При работе в Windows 7 «Ошибка 5. Отказано в доступе» создаёт определённые сложности для пользователей, препятствуя выполнению всевозможных действий. Возникает она по причине якобы отсутствующих прав доступа. Однако тут же возникает вопрос, а как же они могут отсутствовать, если вы работаете в системе под учётной записью «Администратора»?

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

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

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

    Часто после выполнения таких нехитрых последовательных действий в Windows 10 или 7, проблема исчезает. При работе с директориями вы уже не столкнётесь с проблемами и пугающими окнами. Если же вы и после выполнения таких действий, продолжаете сталкиваться с неисправностью, тогда предлагаем вам выполнить ещё кое-какие действия, подразумевающие внесение изменений в параметры учётных записей пользователей. Не пугайтесь, этот предлагаемый метод не влечёт никаких сложностей, он до удивления прост, но весьма эффективен.

    Изначально нам нужно попасть в «Панель управления». Сделать это несложно, если кликнуть по меню «Пуск», а затем переориентировать взгляд на правую часть открывшегося меню. Там легко найти строку «Панель управления», остаётся только просто на неё кликнуть.

    В открывшемся новом окне перейдите на «Учётные записи пользователей». Теперь предстоит найти строку «Изменение параметров контроля учётных записей».

    На экране вы обнаружите ползунок, легко перемещающийся вверх или вниз при помощи мышки. Нужно переместить ползунок в самый низ, именно там находится отметка, сопровождающаяся параметром «Никогда не уведомлять». Чтобы все изменения вступили в силу, нажмите на кнопку перезагрузки.

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

    Безусловно, переустановка операционной системы займёт время, но именно она позволит не только избавиться от ошибки 5, но и устранить другие системные глюки, а также распрощаться с уже проникшими на ваш компьютер вирусами. Итак, мы уверены, что, вооружившись этой информацией, вы сможете самостоятельно решить проблему, связанную с отказом в доступе.

    Исправление «Ошибки 5: отказано в доступе» в Windows 7

    Способ 1: Запуск от имени администратора

    Самое простое и быстрое решение – это произвести запуск инсталлятора игры от имени администратора. Необходимо выполнить простые действия:

    Выполнив эти шаги, программное решение успешно запуститься.

    Хочется отметить, что существует софт, которому для запуска необходимы права администратора. Иконка такого объекта будет иметь пиктограмму щита.

    Способ 2: Доступ к папке

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

    Способ 3: Учетные записи пользователей

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

    Должно выглядеть вот так.

    Мы рады, что смогли помочь Вам в решении проблемы.

    Помимо этой статьи, на сайте еще 11956 инструкций.
    Добавьте сайт Lumpics. ru в закладки (CTRL+D) и мы точно еще пригодимся вам.

    Отблагодарите автора, поделитесь статьей в социальных сетях.

    Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

    RD1007 > 2.PNG» data-location=»База знаний > RD1007 > 2.PNG» data-image-height=»440″ data-image-w >

    RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-location=»База знаний > RD1007 > p18p32ujpj7eclal1s431ledq0s1.jpg» data-image-height=»187″ data-image-w >

    Проверьте установлен ли на вашем компьютере антивирус 360 Total Security.

    При установке Драйверов Рутокен антивирус 360 Total Security запрашивает разрешение на установку.

    1) Запустите Утилиту удаления Драйверов Рутокен, чтобы очистить систему от предыдущих неудачных установок

    2) Если после окончания работы утилита попросит перезагрузить компьютер, сделайте это

    3) Установите Драйверы Рутокен в зависимости от разрядности вашего компьютера:

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

    При необходимости, вы сможете установить «360 Total Security» после успешной установки «Драйверов Рутокен».

    RD1007 > image2016-10-26 11:31:35.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:31:35.jpg» data-image-height=»680″ data-image-w >

    RD1007 > image2016-10-26 11:33:24.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:33:24.jpg» data-image-height=»524″ data-image-w > RD1007 > image2016-10-26 11:35:42.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:35:42.jpg» data-image-height=»144″ data-image-w >

    RD1007 > image2016-10-26 11:37:7.jpg» data-location=»База знаний > RD1007 > image2016-10-26 11:37:7.jpg» data-image-height=»399″ data-image-w >

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

    У текущего пользователя могут отсутствовать права ни установку программ. Установите «Драйверы Рутокен» из-под учетной записи Администратора.

    Задать вопрос

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

    Согласие на обработку персональных данных

    СОГЛАСИЕ
    на обработку персональных данных

    1. Согласие дается на обработку персональных данных, как без использования средств автоматизации, так и с их использованием.

    2. Согласие дается на обработку следующих персональных данных:

    • персональные данные, не являющиеся специальными или биометрическими: фамилия, имя, отчество;
    • место работы и занимаемая должность;
    • адрес электронной почты;
    • номера контактных телефонов;
    • сведения о почтовом клиенте;
    • сведения об используемом браузере;
    • сведения о переходах по ссылкам в электронных письмах;
    • сведения о месторасположении;
    • сведения об IP-адресах, с которых пользователь открывает электронное письмо.

    3. Персональные данные не являются общедоступными.

    4. Цель обработки персональных данных:

    5. Основанием для обработки персональных данных является: статья 24 Конституции Российской Федерации; устав Оператора; настоящее согласие на обработку персональных данных.

    6. В ходе работы с персональными данными будут совершены следующие действия: сбор, запись, систематизация, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передача (распространение, предоставление, доступ), блокирование, удаление, уничтожение.

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

    9. В случае отзыва субъектом персональных данных или его представителем согласия на обработку персональных данных Оператор вправе продолжить обработку персональных данных без согласия субъекта персональных данных при наличии оснований, указанных в пунктах 2–11 части 1 статьи 6, части 2 статьи 10 и части 2 статьи 11 Федерального закона № 152-ФЗ «О персональных данных» от 27.07.2006.

    10. Согласие действует все время до момента прекращения обработки персональных данных.

    Проверьте установлен ли на вашем компьютере антивирус 360 Total Security.

    При установке Драйверов Рутокен антивирус 360 Total Security запрашивает разрешение на установку.

    1) Запустите Утилиту удаления Драйверов Рутокен, чтобы очистить систему от предыдущих неудачных установок

    2) Если после окончания работы утилита попросит перезагрузить компьютер, сделайте это

    3) Установите Драйверы Рутокен в зависимости от разрядности вашего компьютера:

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

    При необходимости, вы сможете установить «360 Total Security» после успешной установки «Драйверов Рутокен».


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

    У текущего пользователя могут отсутствовать права ни установку программ. Установите «Драйверы Рутокен» из-под учетной записи Администратора.

    Способ 1: Запуск с привилегиями администратора

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

      Убедитесь, что у текущей учётной записи нужные права есть. Если это не так, предоставьте или получите их.

    Способ 2: Открытие доступа к каталогам

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

    Внимание! Процедура может нарушить работу компьютера, поэтому рекомендуем создать точку восстановления!

    Урок: Точка восстановления в Windows 10

    1. Откройте «Этот компьютер», найдите в нём системный накопитель и кликните по нему ПКМ, затем выберите в меню пункт «Свойства».

    Способ 3: «Командная строка»

    Рассматриваемая проблема может касаться только той или иной службы Виндовс. В этом случае можно воспользоваться средством «Командная строка».

      Откройте «Поиск», в котором начните вводить запрос командная строка . Выделите найденное приложение и нажмите на ссылку «Запуск от имени администратора» в правой части окна.

    net localgroup Администраторы /add networkservice

    net localgroup Администраторы /add localservice

    Обратите внимание! Пользователям Windows 10 с английской локализацией системы необходимо вводить Administrators вместо Администраторы!

    Способ 4: Устранение проблем с Виндовс

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

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

    Заключение

    Мы рассмотрели варианты решения проблемы, при которой в Виндовс 10 появляется ошибка с кодом 5 и текстом «Отказано в доступе». Как видим, возникает она по разным причинам, из-за чего нет универсального метода устранения.

    Мы рады, что смогли помочь Вам в решении проблемы.

    Отблагодарите автора, поделитесь статьей в социальных сетях.

    Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

    Источник

    Adblock
    detector

Добавить комментарий