См. также:
- Двухфакторная PAM-аутентификация с использованием ключевых носителей: пакет libpam-csp;
- Двухфакторная PAM-аутентификация с использованием ключевых носителей: пакет libpam-p11;
- Двухфакторная PAM-аутентификация с использованием ключевых носителей: пакет libpam-pkcs11;
- Двухфакторная аутентификация в доменах;
- Программный эмулятор ключевых носителей softhsm2;
- Единый доступ к ключевым носителям разных производителей.
Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
- Astra Linux Special Edition РУСБ.10015-17
- Astra Linux Special Edition РУСБ.10015-37
- Astra Linux Special Edition РУСБ.10015-03
Данная статья неприменима к ключевым носителям, работающим по стандартам U2F (FIDO) и FIDO2.
В соответствии с указаниями производителя данная статья в части подготовки ключевых носителей к работе неприменима к токенам Аладдин JaCarta-2 ГОСТ:
Согласно «Правилам пользования сертифицированного устройства JaCarta-2 ГОСТ» администрирование такого устройства должно выполняться с использованием СКЗИ «Криптотокен 2 ЭП» в исполнении 13 – «АРМ администратора безопасности JaCarta-2 ГОСТ».
АРМ администратора безопасности необходим для:
- инициализации JaCarta-2 ГОСТ;
- импорта доверенного открытого ключа в JaCarta-2 ГОСТ;
- генерации собственной ключевой пары в JaCarta-2 ГОСТ;
- смены ключа администратора безопасности;
- установки PIN- и PUK-кодов пользователя в JaCarta-2 ГОСТ;
- разблокирования JaCarta-2 ГОСТ;
- управления файлами в JaCarta-2 ГОСТ;
- генерации и управления мастер-ключами;
- генерации ключей для HMAC, импорта и управления ими в JaCarta-2 ГОСТ;
- установки и смены пароля сброса JaCarta-2 ГОСТ к заводским настройкам;
- сброса JaCarta-2 ГОСТ к заводским настройкам;
- просмотра журналов операций СКЗИ «Криптотокен 2 ЭП» при работе АРМа администратора безопасности.
Термины
Ключевой носитель (токен, смарт-карта) — устройство для хранения информации, обеспечивающее защиту хранимой информации. Термин ключевой применяется в силу того, что подобные носители часто используются для хранения ключей (сертификатов, электронно-цифровых подписей), т. е. данных, используемых для аутентификации владельца. Однако, в ключевом носителе могут защищенно храниться любые данные (например, текстовые файлы). Защита обеспечивается:
необходимостью ввода пароля (PIN-кода) для доступа к данным;
возможностью выполнять криптографические операции непосредственно на ключевом носителе (только для активных ключевых носителей).
- Токен — ключевой носитель, подключающийся непосредственно к компьютеру и не требующий для подключения специальных промежуточных устройств. Обычно реализуется в форм-факторе USB-устройства. Термин токен часто применяется к смарт-картам (см. ниже).
- Смарт-карта — ключевой носитель в форм-факторе кредитной карты, подключающийся к специальному промежуточному устройству — считывателю, подключенному к компьютеру.
- PIN-код — пароль пользователя для доступа к пользовательским данным, хранящимся в ключевом носителе. Термин PIN обычно ассоциируется с цифровыми значениями, однако в PIN-кодах ключевых носителей допускается также использование букв латинского алфавита и, в некоторых моделях, спецсимволов.
- SO-PIN-код — пароль администратора ключевого носителя. Производителями задаются стандартные значения PIN- и SO-PIN-кодов, которые в обязательном порядке должны быть изменены при передаче ключевых носителей в эксплуатацию. Справку по стандартным значениям кодов см. в статьях:
- Криптопровайдер — модуль, позволяющий выполнять криптографические операции. Применительно к ключевым носителям это встроенный в носитель программно-аппаратный модуль, позволяющий выполнять криптографические операции непосредственно на ключевом носителе, без экспорта ключей за его пределы.
- Пассивный ключевой носитель — ключевой носитель, не имеющий встроенного криптопровайдера. Например, токены Аладдин JaCarta LT, Рутокен Lite, Рутокен S. Такие ключевые носители предназначены для защищенного хранения данных, и не предназначены для аутентификации с использованием ключевых пар. Такие носители могут не поддерживать сохранение данных типа закрытый ключ и секретный ключ (однако любые данные могут быть сохранены как тип данные).
- Апплет — встроенное приложение ключевого носителя. См, например: Аладдин: Работа с апплетами.
Функции и особенности ключевого носителя определяются содержащимися в нём апплетами. В ключевом носителе может содержаться несколько апплетов с разными функциями. Когда речь идет о работе с ключевым носителем, в самом деле подразумевается работа с одним из содержащихся в нем апплетов. Некорректный выбор апплета при выполнении операций с ключевым носителем может вести к утрате функциональности носителя.
- Активный ключевой носитель — ключевой носитель, способный самостоятельно выполнять криптографические операции, например, генерацию ключевых пар с созданием неизвлекаемого закрытого ключа. Например, токены Рутокен ЭЦП и большинство токенов Аладдин.
- Закрытый ключ — ключ асимметричной криптосистемы, принадлежащий исключительно владельцу ключа и не подлежащий распространению. Используется для дешифрования данных, зашифрованных соответствующим открытым ключом.
- Открытый ключ — ключ асимметричной криптосистемы, создаваемый на основе закрытого ключа и подлежащий распространению. Используется корреспондентами владельца закрытого ключа для шифрования сообщений, предназначенных владельцу закрытого ключа.
- Неизвлекаемый ключ — закрытый или секретный ключ, хранящийся в активном ключевом носителе и не подлежащий передаче за его пределы. Такой ключ, как правило, создается криптопровайдером активного ключевого носителя и все операции с таким ключом выполняются криптопровайдером внутри носителя. Не поддерживается пассивными носителями.
- Секретный ключ — ключ симметричной криптосистемы. Используется:
- обеими сторонами коммуникации для шифрования и дешифрования данных;
- владельцем ключа для шифрования и дешифрования собственных данных.
- Ключевая пара — закрытый ключ и соответствующий ему открытый ключ.
- Сертификат открытого ключа (сертификат) — пакет данных, состоящий из открытого ключа и информации о его владельце, скрепленных электронной подписью либо доверенного удостоверяющего центра, либо самого владельца соответвующего закрытого ключа (самоподписанный сертификат). Используется для идентификации владельца открытого ключа.
- PKCS #15: Cryptographic Token Information Format Standard — стандартный формат хранения данных в ключевых носителях. Используется как в активных, так и в пассивных ключевых носителях (доступность тех или иных операций зависит от реализации устройства).
- PKCS #11: Cryptographic Token Interface Standard (Cryptoki) — стандартный программный интерфейс активных ключевых носителей. Является интерфейсом более высокого уровня, чем PKCS #15. Частично применим к пассивным ключевым носителям (зависит от реализации). Описание доступно по ссылке: PKCS #11 Cryptographic Token Interface Base Specification Version 3.0.
URL (URI) — текстовый адрес ключевого носителя или объекта в ключевом носителе. Служит для идентификации ключевых носителей (объектов в ключевом носителе) при использовании протокола PKCS#11. Например, URL ключевого носителя и URL объекта (публичного ключа) в токене Аладдин JaCarta:
URL: pkcs11:model=JaCarta%20Laser;manufacturer=Aladdin%20R.D.;serial=4E46002229073933;token=toklabel URL: pkcs11:model=JaCarta%20Laser;manufacturer=Aladdin%20R.D.;serial=4E46002229073933;token=toklabel;id=%45;object=objlabel;type=public
Подробнее см. RFC 7512 The PKCS #11 URI Scheme.
- Слот — условная точка подключения ключевого носителя. Номер слота может использоваться для идентификации ключевых носителей при использовании протокола PKCS#11. Может быть использован в составе URL для идентификации объектов в конкретном ключевом носителе.
- APDU (Application Protocol Data Unit) — протокол обмена данными со смарт-картами.
Ключевые носители, совместимые с Astra Linux
Данная статья неприменима к ключевым носителям, работающим по стандартам U2F (FIDO) и FIDO2.
Актуальных список совместимых ключевых носителей приведен на WEB-сайте Astra Linux в разделе Ready for Astra. При написании этой статьи использовались следующие ключевые носители — токены:
- Рутокен S;
- Рутокен Lite;
- Рутокен ECP 3.0;
- Аладдин JaCarta Laser (JaCarta PKI);
- Аладдин JaCarta ГОСТ 2.0.
Далее в примерах используется именно этот комплект подключенных ключевых носителей. Все эти ключевые носители подключаются по интерфейсу USB, и далее в тексте подразумевается именно такое подключение.
Отдельно статья успешно проверена на следующих токенах (в примерах статьи не используются):
- Аладдин JaCarta PRO, так же определяется как Bank of Lithuania Identification card и Gemalto SafeNet eToken Java Based Cards;
- Аладдин SafeNet eToken 5100, он же Aladdin Knowledge Systems Token JC (далее в тексте — eToken).
- Аладдин JaCarta LT.
Отличия в работе с разными моделями описаны непосредственно в примерах команд.
Особенности применения ключевых носителей в виртуальных машинах
При работе с виртуальными машинами (ВМ) ключевые носители, подключенные к хост-машине, могут быть переданы ("проброшены") в виртуальные машины как обычные USB-устройства. При этом:
Для корректной передачи и дальнейшей работы устройства в ВМ на хост-машине должна быть отключена служба pcscd:
sudo systemctl stop pcscd.service pcscd.socket- После перезапуска ВМ устройство может отображаться, как переданное ВМ, но быть неработоспособно. Для предотвращения/устранения этой проблемы следует переподключать устройства после перезапуска ВМ.
Программное обеспечение для работы с ключевыми носителями
Инструменты командной строки
| Инструмент (команда, библиотека) | Пакет | Комментарий | Доступность |
|---|---|---|---|
| opensc-asn1 | opensc | Инструмент для работы с данными в формате ASN.1 | Основной репозиторий Astra Linux |
| opensc-explorer | opensc | Инструмент для интерактивной и пакетной работы с ключевыми носителями | Основной репозиторий Astra Linux |
| opensc-notify | opensc | Инструмент для мониторинга событий, связанных с ключевыми носителями | Основной репозиторий Astra Linux |
| opensc-tool | opensc | Инструмент командной строки для работы с ключевыми носителями | Основной репозиторий Astra Linux |
| p11-kit | p11-kit | Инструмент командной строки для работы с ключевыми носителями PKCS#11 | Основной репозиторий Astra Linux |
| p11tool | gnutls-bin | Инструмент командной строки для работы с ключевыми носителями PKCS#11 | Базовый репозиторий Astra Linux |
| pcsc_scan | pcsc-tools | Сканер подключенных ключевых носителей | Основной репозиторий Astra Linux |
| pkcs11-data | pkcs11-data | Инструмент командной строки для работы с ключевыми носителями PKCS#11 | Репозиторий Debian |
| pkcs11-register | opensc | Инструмент командной строки для регистрации ключевых носителей PKCS#11 в известных приложениях (Chrome, Firefox, Thunderbird, Seamonkey) | Основной репозиторий Astra Linux |
| pkcs11-tool | opensc | Инструмент командной строки для работы с ключевыми носителями PKCS#11 | Основной репозиторий Astra Linux |
| pkcs15-crypt | opensc | Инструмент командной строки для выполнения криптографических операций с ключевыми носителями PKCS#15 | Основной репозиторий Astra Linux |
| pkcs15-init | opensc | Инструмент командной строки для инициализации ключевых носителей PKCS#11 | Основной репозиторий Astra Linux |
| pkcs15-tool | opensc | Инструмент командной строки для работы со структурами данных PKCS#15 | Основной репозиторий Astra Linux |
| rtadmin | Поставляется в виде исполняемого файла | Инструмент командной строки для работы с ключевыми носителями Рутокен. Для Astra Linux Special Edition 1.8 следует использовать версию rtadmin не ниже 3.1 | Утилита администрирования Рутокен (rtAdmin) |
| python-pkcs11 | Пакет репозиториев pip/pip3 python-pkcs11 | Библиотека Python | Репозитории pip/pip3 |
| libp11.so | libp11-dev | Библиотека C, стандартная ссылка на актуальную реализацию для разработчиков. | Базовый репозиторий Astra Linux |
| libp11.so.3 libp11.so.3.4.1 | libp11-3 | Библиотека C, актуальная реализация. | Основной репозиторий Astra Linux |
| softhsm2-util | softhsm2 | Инструмент командной строки из пакета softhsm2. | Основной репозиторий Astra Linux |
Модули аутентификации
| Модуль | Пакет | Комментарий | Блокировка пользовательской сессии при отключении ключевого носителя | Доступность |
|---|---|---|---|---|
| pam_csp | libpam-csp | Модуль аутентификации по паролю, сохраненному в токене. Для доступа к сохраненному паролю используется PIN-код. Допускает использование пассивных токенов | Только при условии использования csp-monitor. | Основной репозиторий Astra Linux |
| pam_p11 | libpam-p11 | Модуль аутентификации по сертификату. Проверка сертификата выполняется с помощью неизвлекаемого ключа. Требует использования активного токена | Нет | Основной репозиторий Astra Linux |
| pam_pkcs11 | libpam_pkcs11 | Универсальный модуль аутентификации. Возможна настройка разных способов проверки, в том числе без использования токенов (LDAP) | Да | Основной репозиторий Astra Linux |
| pam_sss | sssd | Универсальный модуль аутентификации в домене службы sssd. Поддерживает аутентификацию с использованием ключевых носителей. | Нет | Основной репозиторий Astra Linux |
Дополнительные библиотеки для работы с ключевыми носителями
| Библиотека | Пакет | Комментарий | Доступность |
|---|---|---|---|
Архитектура x86-64: | opensc-pkcs11 | Реализация протокола PKCS#11 общего назначения | Основной репозиторий Astra Linux |
| Архитектура x86-64: /usr/lib/x86_64-linux-gnu/engines-1.1/libpkcs11.so (/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so) Архитектура aarch64: /usr/lib/aarch64-linux-gnu/engines-1.1/libpkcs11.so (/usr/lib/aarch64-linux-gnu/engines-1.1/pkcs11.so) | libengine-pkcs11-openssl | Единый интерфейсный модуль openssl. Обеспечивает возможность работы с интерфейсными библиотеками разных ключевых носителей. | Основной репозиторий Astra Linux |
| /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so | ifd-rutokens | Драйвер для токенов Rutoken S | https://www.rutoken.ru/support/download/nix/ |
| /usr/lib/librtpkcs11ecp.so | librtpkc11ecp | Интерфейсная библиотека PKCS#11/PKCS#15 для токенов Рутокен ЭЦП | https://www.rutoken.ru/support/download/nix/ |
| /usr/lib/libjcPKCS11-2.so | jcpkcs11-2 | Интерфейсная библиотека PKCS#11 для токенов Аладдин | Предоставляется производителем. Может быть доступна в составе ПО "Единый клиент JaCarta" |
Графические инструменты для работы с ключевыми носителями
| Инструмент | Пакет | Комментарий | Доступность |
|---|---|---|---|
| Единый клиент JaCarta | Не оформлен в виде пакета Debian. Поставляется производителем в виде архива. Сценарий установки включен в архив | Графический инструмент для работы с ключевыми носителями Аладдин, кроме апплетов JaCarta-2 ГОСТ. В том числе инструмент применим для работы с ключевыми носителями eToken | Единый клиент JaCarta |
| АРМ администратора безопасности JaCarta-2 ГОСТ | Форма поставки неизвестна | Инструмент для работы с апплетами Аладдин JaCarta-2 ГОСТ. В Astra Linux неприменим | Поставляется на коммерческой основе |
| АРМ разработчика JaCarta-2 ГОСТ | Форма поставки неизвестна | Инструмент для работы с апплетами Аладдин JaCarta-2 ГОСТ. В Astra Linux неприменим | Входит в состав JaCartа-2. SDK, предоставляется производителем по запросу |
| Центр управления Рутокен | rtcontrolcenter | Центр управления Рутокен для GNU/Linux DEB | Контрольный центр Рутокен |
Подготовка к работе с ключевыми носителями
Установка интерфейсных библиотек производителей
Интерфейсная библиотека Рутокен ЭЦП
Интерфейсная библиотека Рутокен librtpkcs11ecp.so представлена в пакете librtpkcs11ecp. Для установки пакета:
- Загрузить актуальную версию по ссылке: https://www.rutoken.ru/support/download/pkcs/.
Выполнить установку из загруженного файла:
sudo apt install ./librtpkcs11ecp_*_amd64.deb
В разных обновлениях Astra Linux и на разных аппаратных платформах эта библиотека может размещаться в различных каталогах. Далее в примерах предполагается, что библиотека расположена в файле /usr/lib/librtpkcs11ecp.so (актуально для платформы x86-64). Для того, чтобы определить реальное расположение библиотеки, можно использовать команду:
Драйверы Рутокен S
Драйверы Рутокен S (библиотека librutokens.so) представлены в пакете ifd-rutokens. Для установки пакета:
- Загрузить актуальную версию по ссылке: https://www.rutoken.ru/support/download/get/rtDrivers-x64-deb.html.
Выполнить установку из загруженного файла:
sudo apt install ./ifd-rutokens_*_amd64.deb
Интерфейсная библиотека Аладдин libjcPKCS11-2.so
Инструкция по установке предоставляется производителем. Библиотека также применима для работы с eToken (для работы с этими токенами следует использовать последние доступные версии библиотеки).
Универсальный интерфейсный модуль openssl libpkcs11.so
Интерфейсный модуль openssl libpkcs11.so обеспечивает единый интерфейс для доступа к ключевым носителям через интерфейсные библиотеки этих носителей. Для доступа к ключевым носителям используется инструменты p11-kit и pkcs11tool (см. далее).
Интерфейсный модуль openssl libpkcs11.so входит в состав пакета libengine-pkcs11-openssl и может быть установлен с помощью графического менеджера пакетов или командой:
После установки пакета:
- Для использовании модуля libpkcs11.so следует отключить использование модуля opensc-pkcs11.so (если установлен пакет opensc-pkcs11), для чего создать файл /etc/pkcs11/modules/opensc-pkcs11.module, запрещающий использование этого модуля:echo -e "enable-in:" | sudo tee /etc/pkcs11/modules/opensc-pkcs11.module > /dev/null
- Указать интерфейсные библиотеки ключевых носителей, с которыми будет осуществляться взаимодействие через libpkcs11.so, для чего создать соответствующие файлы в каталоге /etc/pkcs11/modules/ (предполагается, что интерфейсные модули установлены):
- Для токенов Аладдин:echo -e "module: /usr/lib/libjcPKCS11-2.so" | sudo tee /etc/pkcs11/modules/aladdin.module
- Для токенов Рутокен:echo -e "module: /usr/lib/librtpkcs11ecp.so" | sudo tee /etc/pkcs11/modules/rutoken.module > /dev/null
- Для токенов Аладдин:
Специально указывать модуль в конфигурации openssl нет необходимости. Проверить готовность модуля можно командами:
пример вывода команды:
(pkcs11) pkcs11 engine
[ available ]
или использовать инструмент командной строки p11toool (см. ниже).
Инструмент командной строки p11tool
Для установки инструмента командной строки p11tool:
- Для обновлений, вышедших ранее Astra Linux Special Edition 1.8: подключить базовый репозиторий.
Установить пакет gnutls-bin:
sudo apt install gnutls-bin- При необходимости использовать интерфейсные библиотеки производителей:
Создать каталог /etc/pkcs11/modules/:
sudo mkdir -p /etc/gnutls- Создать файлы в каталоге /etc/pkcs11/modules/ (общая системная конфигурация). Минимальное содержимое файлов — строка в формате module: <путь_к_библиотеке>, подробнее см. man pkc11.conf. Пользовательские конфигурации могут быть размещены в каталоге ~/.config/pkcs11/pkcs11.conf,
Основные действия с ключевыми носителями
Поиск и идентификация подключенных ключевых носителей
Физические устройства — инструмент lsusb
Самой надежной командой для поиска подключенных токенов является команда lsusb. Эта команда:
- не требует установки никаких дополнительных пакетов;
- распознает подключенные устройства на физическом уровне, даже если они программно полностью несовместимы с используемой ОС.
В том числе, командой обнаруживаются токены, работающие по стандартам U2F (FIDO) и FIDO2.
Пример вывода команды (для наглядности приведена только информация о токенах):
Bus 002 Device 009: ID 24dc:0101 Aladdin R.D Aladdin R.D. JaCarta
Bus 002 Device 006: ID 0a89:0020 Aktiv Rutoken S
Bus 002 Device 011: ID 24dc:0101 Aladdin R.D Aladdin R.D. JaCarta
Bus 002 Device 010: ID 0a89:0030 Aktiv Rutoken ECP
Bus 002 Device 007: ID 0a89:0025 Aktiv Rutoken lite
- числовой код производителя (VID):
- 0a89 — Рутокен;
- 24dc — Аладдин;
- 0529 — Аладдин eToken;
- числовой код модели (PID):
- для токенов Рутокен (подробнее см. ATR-строки и PID/VID Рутокен):
- 0020 — Aktiv Rutoken S;
- 0030 — Aktiv Rutoken ECP;
- 0025 — Aktiv Rutoken Lite;
- 0090 —токены Рутокен U2F, к которым настоящая статья неприменима;
- 0093 —Aktiv — токены Рутокен MFA, к которым настоящая статья неприменима;
- для токенов Аладдин:
- 0620 — Аладдин eToken;
- 0406 — Аладдин JaCarta SF ГОСТ, к которым настоящая статья неприменима;
- 0101 — токены Аладдин JaCarta, в том числе:
- Аладдин JaCarta Laser (JaCarta PKI), рассматриваются далее в статье;
- Аладдин JaCarta ГОСТ 2.0, к которым настоящая статья неприменима;
- 0501 — токены Аладдин JaCarta U2F, к которым настоящая статья неприменима;
- 0102 — токены Аладдин JaCarta LT;
- 0401 — токены Аладдин JaCarta WebPass, к которым настоящая статья неприменима.
- для токенов Рутокен (подробнее см. ATR-строки и PID/VID Рутокен):
Инструмент командной строки pcsc_scan
Инструмент командной строки pcsc_scan представлен в пакете pcsc-tools. Установка пакета:
Служба pcscd не работает постоянно. Служба останавливается после 60 секунд неактивности и активируется по мере поступления запросов через сокет pcscd.socket. При недостатке вычислительных ресурсов (например, создать дефицит ресурсов можно включив режим отладки в службе pcscd) активация по запросу может выполняться слишком долго, что ведет к появлению случайных ошибок (например, не обнаруживается служба, не обнаруживаются ключевые носители и пр.).
Команда pcsc_scan без аргументов выводит значительный объем информации об обнаруженных ключевых носителях, после чего ожидает подключение новых устройств (прекратить ожидание можно, нажав Ctrl+C):
Using reader plug'n play mechanism Scanning present readers... 0: Aktiv Rutoken lite 00 00 1: Aktiv Rutoken ECP 01 00 2: Aladdin R.D. JaCarta [SCR Interface] (000000000000) 02 00 3: Aktiv Co. Rutoken S 00 00 4: Aladdin R.D. JaCarta [SCR Interface] (000000000000) 03 00
Возможно также получить идентификационные строки ключевых носителей (Answer To Reset, ATR):
Reader 0: Aktiv Rutoken lite 00 00 ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2 Reader 1: Aktiv Rutoken ECP 01 00 ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 20 44 53 20 C1 Reader 2: Aladdin R.D. JaCarta [SCR Interface] (000000000000) 02 00 ATR: 3B DC 18 FF 81 91 FE 1F C3 80 73 C8 21 13 66 01 06 11 59 00 01 28 Reader 3: Aktiv Co. Rutoken S 00 00 ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00 Reader 4: Aladdin R.D. JaCarta [SCR Interface] (000000000000) 03 00 ATR: 3B DC 18 FF 81 91 FE 1F C3 80 73 C8 21 13 66 01 06 11 59 00 01 28
Для ключевых носителей Рутокен значения ATR задокументированы, см. ATR-строки и PID/VID Рутокен. Для ключевых носителей Аладдин ATR одинаковый, и на этом уровне идентифицировать модель устройства не представляется возможным.
Пример кода для анализа ATR: https://github.com/LudovicRousseau/pyscard-contrib/tree/master/parseATR.
Служба pcscd по умолчанию настроена так, что автоматически отключается после 60 секунд бездействия и перезапускается по требованию. Такое поведение может вести к "плавающим" ошибкам при обращениях к ключевым носителям в случаях, когда служба не успевает запуститься.
Для предотвращения таких ошибок можно запретить автоматическое отключение, удалив параметр службы --auto-exit. Для этого:
Выполнить команду:
sudo systemctl edit pcscd.serviceВвести текст:
[Service] ExecStart= ExecStart=/usr/sbin/pcscd --foreground
- Сохранить изменения.
Перезапустить службу pcscd.service:
sudo systemctl restart pcscd.service
Инструмент командной строки p11tool
Инструмент командной строки p11tool представлен в пакете gnutls-bin и может быть установлен командой:
... Token 3: URL: pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=00000000419b79e8;token=Rutoken%20ECP Label: Rutoken ECP Type: Hardware token Flags: uPIN uninitialized Manufacturer: Aktiv Co. Model: PKCS#15 Serial: 00000000419b79e8 Module: opensc-pkcs11.so ... Token 6: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed Label: 413a49ed Type: Hardware token Flags: RNG, Requires login Manufacturer: Aktiv Co. Model: Rutoken ECP Serial: 413a49ed Module: librtpkcs11ecp.so
Для получения краткого списка URL ключевых носителей можно использовать опцию --list-token-urls:
pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust pkcs11:model=JaCarta%20Laser;manufacturer=Aladdin%20R.D.;serial=4E46001953483957;token=4E46001953483957 pkcs11:model=JaCarta%20GOST%202.0;manufacturer=Aladdin%20R.D.;serial=4E46001310573957;token=JaCarta-2%20GOST pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=00000000419b79e8;token=Rutoken%20ECP pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=41538f00;token=Rutoken%20S pkcs11:model=Rutoken%20lite;manufacturer=Aktiv%20Co.;serial=419b79e8;token=419b79e8 pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed
Получить список URL ключевых носителей можно также использовав опцию --list-all (показать все объекты ключевого носителя), не указав конкретный URL носителя. При этом будет выведено предупреждение и список URL доступных ключевых носителей:
warning: no token URL was provided for this operation; the available tokens are:
pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust
pkcs11:model=JaCarta%20Laser;manufacturer=Aladdin%20R.D.;serial=4E46001953483957;token=4E46001953483957
pkcs11:model=JaCarta%20GOST%202.0;manufacturer=Aladdin%20R.D.;serial=4E46001310573957;token=JaCarta-2%20GOST
pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=00000000419b79e8;token=Rutoken%20ECP
pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=41538f00;token=Rutoken%20S
pkcs11:model=Rutoken%20lite;manufacturer=Aktiv%20Co.;serial=419b79e8;token=419b79e8
pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed
При необходимости можно зафиксировать интерфейсную библиотеку. Например, для интерфейсной библиотеки Рутокен:
pkcs11:model=Rutoken%20lite;manufacturer=Aktiv%20Co.;serial=419b79e8;token=419b79e8
pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed
Инструмент командной строки pkcs11-tool
Инструмент командной строки pkcs11-tool представлен в пакете opensc и может быть установлен командой:
Available slots: Slot 0 (0x0): Aktiv Rutoken lite 00 00 token label : Rutoken ECP token manufacturer : Aktiv Co. token model : PKCS#15 token flags : token initialized hardware version : 0.0 firmware version : 0.0 serial num : 00000000419b79e8 pin min/max : 4/8 Slot 1 (0xc): Aktiv Co. Rutoken S 00 00 token label : Rutoken S token manufacturer : Aktiv Co. token model : PKCS#15 token flags : rng, token initialized hardware version : 0.0 firmware version : 0.0 serial num : 41538f00 pin min/max : 4/8
В выводе команды, помимо информации о ключевом носителе, указывается информация для выбора носителя при выполнении операций:
- номера слотов в шестнадцатеричном виде, в примере выше в скобках 0x0 и 0x1;
- индексы слотов в десятичном виде, в примере выше 0 и 1.
Далее для выбора ключевого носителя можно использовать опции:
- --slot <номер_слота> — выбор по номеру слота (номер может быть указан как в шестнадцатеричном, так и в десятичном виде);
- --slot-index <индекс_слота> — выбор по индексу слота (индекс указывается в десятичном виде).
Используемые инструментом модули должны быть указаны в командной строке (опция --module). Например, для интерфейсного модуля Рутокен:
Available slots:
Slot 0 (0x0): Aktiv Rutoken lite 00 00
token label : 419b79e8
token manufacturer : Aktiv Co.
token model : Rutoken lite
token flags : login required, rng, SO PIN to be changed, token initialized, PIN initialized, user PIN to be changed
hardware version : 65.4
firmware version : 30.2
serial num : 419b79e8
pin min/max : 4/32
Slot 1 (0x1): Aktiv Rutoken ECP 01 00
token label : 413a49ed
token manufacturer : Aktiv Co.
token model : Rutoken ECP
token flags : login required, rng, SO PIN to be changed, token initialized, PIN initialized, user PIN to be changed
hardware version : 60.1
firmware version : 30.2
serial num : 413a49ed
pin min/max : 6/32
Available slots:
Slot 0 (0x1ffff): Aladdin R.D. JaCarta [SCR Interface] (000000000000) 02 00
token label : 4E46001953483957
token manufacturer : Aladdin R.D.
token model : JaCarta Laser
token flags : login required, token initialized, PIN initialized
hardware version : 1.0
firmware version : 1.0
serial num : 4E46001953483957
pin min/max : 4/16
Slot 1 (0x2ffff): Aladdin R.D. JaCarta [SCR Interface] (000000000000) 03 00
token label : JaCarta-2 GOST
token manufacturer : Aladdin R.D.
token model : JaCarta GOST 2.0
token flags : login required, rng, token initialized, PIN initialized, other flags=0x800
hardware version : 1.0
firmware version : 2.55
serial num : 4E46001310573957
pin min/max : 6/32
Инструмент командной строки opensc-tool
Инструмент командной строки opensc-tool представлен в пакете opensc и может быть установлен командой:
# Detected readers (pcsc)
Nr. Card Features Name
0 Yes Aktiv Rutoken lite 00 00
1 Yes Aktiv Rutoken ECP 01 00
2 Yes Aladdin R.D. JaCarta [SCR Interface] (000000000000) 02 00
3 Yes Aktiv Co. Rutoken S 00 00
4 Yes Aladdin R.D. JaCarta [SCR Interface] (000000000000) 03 00
Выбор ключевого носителя для работы, чтение каталога данных с ключевого носителя
Инструмент командной строки p11tool
При работе с инструментом p11tool ключевой носитель задается указанием его URL. Например, чтение каталога данных ключевого носителя:
Object 0: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed;id=%45;object=testlabel;type=public Type: Public key (RSA-2048) Label: testlabel ID: 45 Object 1: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed;id=%45;object=sert;type=cert Type: X.509 Certificate (RSA-2048) Expires: Wed Aug 2 17:26:33 2023 Label: sert ID: 45
На ключевом носителе доступны два публичных объекта — открытый ключ (тип public) и сертификат открытого ключа (тип cert). Для получения защищенных объектов следует указать PIN-код пользователя и необходимость аутентификации с заданным PIN-кодом (опция --login). PIN-код передается через переменную окружения GNUTLS_PIN, например:
GNUTLS_PIN=12345678 p11tool --login --list-all 'pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed'
Пример вывода команды:
Object 0: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed;id=%45;object=testlabel;type=public Type: Public key (RSA-2048) Label: testlabel ID: 45 Object 1: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed;id=%45;object=testlabel;type=private Type: Private key (RSA-2048) Label: testlabel Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; ID: 45 Object 2: URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=413a49ed;id=%45;object=sert;type=cert Type: X.509 Certificate (RSA-2048) Expires: Wed Aug 2 17:26:33 2023 Label: sert ID: 45
Кроме публичных объектов также показан защищенный объект — закрытый ключ (тип private), причем ключ неизвлекаемый (флаг CKA_NEVER_EXTRACTABLE).
Инструмент командной строки pkcs11-tool
Инструмент pkcs11-tool использует номера слотов (опция --slot) или индексы слотов (опция --slot-index). Пример получения каталога данных ключевого носителя, находящегося в слоте с номером 0x1ffff:
Using slot 0 with a present token (0x1ffff) Public Key Object; RSA 2048 bits label: testlabel ID: 45 Usage: encrypt, verify Access: local Certificate Object; type = X.509 cert label: sert subject: DN: C=RU, ST=MO, L=Moscow, O=Astra, OU=Wiki/emailAddress=le@astralinux.ru, CN=le ID: 45
Для получения данных с аутентификацией можно использовать опцию --login (при этом PIN-код для аутентификации будет запрошен в интерактивном режиме):
Далее в примерах для упрощения изложения опции выбора ключевого носителя по возможности не указываются. PIN- и SO-PIN-коды задаются в параметрах команд. Рассматривается только применение инструмента pkcs11-tool как более универсального и удобного.
Инициализация (очистка) и подготовка ключевого носителя
Инициализацию ключевых носителей рекомендуется выполнять прикладным программным обеспечением, предоставляем производителями этих носителей. Известные проблемы применения интерфейсных библиотек:
- Инициализация с использованием интерфейсной библиотеки Рутокен librtpkcs11ecp.so не гарантирует удаление объектов, созданных с помощью иных программных средств. При использовании этой библиотеки после инициализации носителя и создания пользовательской структуры следует проверить наличие сохранившихся артефактов и удалить обнаруженные.
- Для инициализации ключевых носителей Аладдин JaCarta Laser (PKI) в зависимости от версии используемого апплета может требоваться указать ранее заданный SO-PIN администратора. При этом количество попыток ввода SO-PIN ограничено. При превышении ограничения апплет блокируется. Для некоторых версий апплетов разблокировка невозможна, некоторые можно разблокировать с помощью Единого Клиента JaCarta.
- Инициализация со сменой SO-PIN может быть выполнена:
- либо с помощью ПО Управляющий Центр JaCarta (при этом старый SO-PIN знать не требуется);
- либо, при наличии старого SO-PIN, в два этапа с помощью инструмента p11tool:
сначала инициализировать ключевой носитель используя старый SO-PIN:
GNUTLS_SO_PIN=<старый_SO-PIN> p11tool --initialize --label "<метка>" "pkcs11:URL"
сменить старый SO-PIN на новый:
GNUTLS_SO_PIN=<старый_SO-PIN> GNUTLS_NEW_SO_PIN=<новый_SO-PIN> p11tool --initialize-so-pin "pkcs11:URL"
- Этот раздел полностью неприменим к апплетам Аладдин ГОСТ 2.0. Для их инициализации следует использовать предоставляемый производителем инструмент Единый Клиент JaCarta. Инициализация этих апплетов в автоматическом режиме (с использованием сценариев) не поддерживается.
Для инициализации обязательными являются указание метки ключевого носителя и SO-PIN-кода. Кроме этого, требуется указать интерфейсный модуль, соответствующий ключевому носителю:
Инициализация ключевого носителя на уровне стандарта PKCS#15 с помощью инструмента pkcs15-init применима к токенам Рутокен. См. Двухфакторная аутентификация: libpam-csp и csp-monitor.
Создаваемая при этом файловая система несовместима с файловой системой, создаваемой при форматировании токена инструментами производителя.
Изменение SO-PIN-кода
Для смены SO-PIN-кода требуется указать действующий и новый коды:
Изменение PIN-кода
При получении ключевого носителя необходимо получить PIN-код. После получения необходимо сменить PIN-код.
В качестве PIN-кода недопустимо использовать значения, используемые производителем носителя по умолчанию. Для уточнения см. документацию на используемые ключевые носители .
Превышение установленного количества попыток ввода PIN-кода ведет к блокировке ключевого носителя.
Некоторые модели могут быть разблокированы администратором, некоторые блокируются необратимо. Для уточнения см. документацию на используемые ключевые носители .
Изменение PIN-кода выполняется его владельцем. Для изменения требуется указать действующий и новый коды:
Создание ключевой пары
При работе с активными ключевыми носителями создание ключевой пары выполняется встроенным криптопровайдером на самом носителе:
- --keypairgen — команда создания ключевой пары;
- --label <метка> — метка (имя) ключевой пары;
- --key-type <алгоритм> — алгоритмы, применяемые для создания ключа. Обычно используется rsa:2048, для ключевых носителей с апплетами Аладдин ГОСТ можно использовать алгоритм GOSTR3410-2001:A.
- --id <идентификатор> — идентификатор ключевой пары. Если не задан, то генерируется автоматически.
Подготовка ключевых пар для размещения в пассивных ключевых носителях может быть выполнена с помощью инструмента openssl. См. документацию man openssl-genrsa.
Далее для использования ключей понадобится их идентифицировать. Для идентификации ключей можно использовать номера слотов или полные идентификаторы (URL). Получить их можно командами:
- Пример получения номеров слотов (понадобится пакет opensc):pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O --login --pin 12345678
sing slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
label: 2FA Token RSA
ID: 353edbce2d69b499615cbff8d4a5900e8c010b70
Usage: encrypt, verify
Access: local
Private Key Object; RSA
label: 2FA Token RSA
ID: 353edbce2d69b499615cbff8d4a5900e8c010b70
Usage: decrypt, sign
Access: sensitive, always sensitive, never extractable, local
Public Key Object; EC EC_POINT 256 bits
EC_POINT: 04410447965c58186119f1f99cb07ae69a6738f07780b16bd25104b688e58f05228a20ccb5ef9b1b4deda7ce1def696bc6ea513cffcee5c4c903168b2972041ec6b16b
EC_PARAMS: 06082a8648ce3d030107
label: 2FA Token ECDSA
ID: 4f1ebb46e552b989aeb70ff1918597a6c2259a81
Usage: verify
Access: local
Private Key Object; EC
label: 2FA Token ECDSA
ID: 4f1ebb46e552b989aeb70ff1918597a6c2259a81
Usage: sign
Access: sensitive, always sensitive, never extractable, local - Пример получения URL (понадобится пакет gnutls-bin):p11tool --list-keys --login --only-urls
pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=2FA%20Token;id=%35%3E%DB%CE%2D%69%B4%99%61%5C%BF%F8%D4%A5%90%0E%8C%01%0B%70;object=2FA%20Token%20RSA;type=private
pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=413a49ed;token=2FA%20Token;id=%4F%1E%BB%46%E5%52%B9%89%AE%B7%0F%F1%91%85%97%A6%C2%25%9A%81;object=2FA%20Token%20ECDSA;type=private
Создание сертификата открытого ключа
Для создания сертификата открытого ключа используется ранее созданная ключевая пара. Создание сертификата выполняется с помощью инструмента openssl. Порядок настройки openssl на работу с ключевыми носителями см. в статье Единый доступ к ключевым носителям разных производителей. Пример выпуска самоподписанного сертификата с использованием неизвлекаемого приватного ключа, расположенного на ключевом носителе:
- Создать запрос на выпуск сертификата:openssl req -new --keyform engine -engine pkcs11 -key "<идентификатор_ключа>" -out "user.csr" \В результате выполнения команды будет создан файл user.csr с запросом на выпуск сертификата.
-subj "/C=RU/ST=MO/L=Moscow/CN=user/OU=Wiki/O=Astra" \
-addext "keyUsage=digitalSignature,keyEncipherment" \
-addext "extendedKeyUsage=serverAuth,clientAuth" \
-passin pass:$GNUTLS_PIN - Создать файл с параметрами сертификата. Например, файл ext.cnf со следующим содержимым:
[ v3_req ] basicConstraints = CA:false extendedKeyUsage = serverAuth,clientAuth keyUsage = digitalSignature,keyEncipherment subjectAltName = email:test@test.com
- Выпустить самоподписанный сертификат:openssl x509 -keyform engine -engine pkcs11 -passin pass:$GNUTLS_PIN -extensions v3_req -extfile ext.cnf -req -days 3650 -in "user.csr" -signkey "$url" -out user.crt
Использование интерактивного режима openssl:
Сохранение данных в ключевом носителе
Созданный на предыдущем шаге сертификат загружается (импортируется) в ключевой носитель следующей командой:
- --type cert — тип загружаемых данных (в данном случае — сертификат);
- -w <имя_файла> — имя загружаемого файла;
- --label <метка> — метка создаваемого объекта;
- --id <идентификатор> — идентификатор ранее созданной ключевой пары.
Сохранять на ключевых носителях можно не только ключи и сертификаты, но и любые данные. При этом:
- используется соответствующий тип данных (при использовании pkcs11-tool — тип данных data, для других инструментов см. документацию);
- идентификатор (опция --id) не используется.
Объекты типа данные идентифицируются метками (--label) и именами приложений (--application-label) (а также идентификаторами приложений (OID), но их получение требует регистрации).
Например, команда для сохранения данных в режиме обычного USB-накопителя:
Для использования встроенной защиты ключевого носителя данные следует сохранять с указанием ключа --private, например:
Экспорт данных, сохраненных в ключевом носителе
Для экспорта сохраненных данных используется опция --read. По умолчанию объект выводится в стандартный вывод (stdout), файл для сохранения объекта можно указать с помощью опции --output-file, например:
Удаление данных
Для удаления данных используется опция --delete-object. Остальные опции (идентификаторы объекта, PIN-код) такие же, как в примерах выше: