Введение
В данной инструкции описывается, как настроить модуль pam_pkcs11 для работы с библиотекой librtpkcs11ecp.so.
Стенд
Нам понадобится токен или смарт-карта семейства Рутокен ЭЦП, отформатированные через Утилита администрирования Рутокен (rtadmin).
Настройки для токена и смарт-карты идентичны.
Общий порядок действий
Шаг 1: Установка необходимых пакетов
Переходим в режим суперпользователя и обновляем список пакетов, затем устанавливаем необходимые компоненты для работы с Рутокен:
su - apt-get update apt-get install librtpkcs11ecp libp11 pam_pkcs11 opensc openssl
Проверка установки библиотеки Рутокен:
ls -la /usr/lib64/librtpkcs11ecp.so
✅ Если файл существует — библиотека установлена успешно
❌ Если файл не найден — установка не удалась, проверьте наличие пакета в репозитории
Шаг 2: Проверка и создание пользователя
Проверяем существование пользователя user и создаём его при необходимости. Этот шаг критически важен, так как все последующие настройки (права доступа, сертификаты, аутентификация) будут применяться именно к этому пользователю:
id user 2>/dev/null || useradd -m user
Установите временный пароль для резервного входа:
echo "user:TempPass123" | chpasswd 2>/dev/null || true
⚠️ Примечание: временный пароль "TempPass123" используется только для резервного входа. После настройки аутентификации через токен рекомендуется сменить пароль.
Проверьте результат:
id user
Шаг 3: Проверка подключения токена
Проверяем, что токен Рутокен ЭЦП корректно определился системой и доступен для работы:
lsusb | grep -i "Aktiv\|Rutoken"
Проверяем доступность токена через библиотеку PKCS#11:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --list-slots
✅ Если устройство отображается — токен физически подключён и определён системой
❌ Если вывод пустой — проверьте подключение токена к порту USB
Шаг 4: Создание ключевой пары на токене
Генерируем на токене новую криптографическую пару ключей (приватный + публичный) с использованием алгоритма RSA длиной 2048 бит. Приватный ключ никогда не покидает токен — это обеспечивает безопасность аутентификации:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type rsa:2048 --id 45 --label "user"
Что делают параметры команды:
- --module /usr/lib64/librtpkcs11ecp.so — указывает путь к библиотеке Рутокен для работы с токеном
- --login — выполняет вход на токен (требуется для операций с ключами)
- --pin 12345678 — передаёт PIN-код пользователя для аутентификации на токене (используется стандартный заводской PIN)
- --keypairgen — команда генерации ключевой пары
- --key-type rsa:2048 — указывает тип ключа (RSA) и длину в битах (2048)
- --id 45 — задаёт уникальный идентификатор ключа (в шестнадцатеричном формате: 0x45)
- --label "user" — присваивает ключу понятную метку для идентификации
⚠️Важно: Идентификатор --id 45 будет использоваться позже для связи сертификата с этим ключом. Он должен совпадать при записи сертификата на токен.
Смена PIN-кода (рекомендуется):
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 12345678 --change-pin --new-pin 123456789
Проверка успешной смены PIN:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 123456789 --list-slots
⚠️ Если команда выше запрашивает старый PIN — смена не удалась. Повторите смену PIN.
Шаг 5: Создание конфигурации OpenSSL
В OpenSSL 3.x изменилась архитектура движков. Для работы с PKCS#11 теперь обязательно требуется конфигурационный файл, даже при использовании переменной окружения OPENSSL_CONF. Этот файл настраивает взаимодействие OpenSSL с библиотекой Рутокен.
Проверяем существование движка PKCS#11 для OpenSSL 3.x:
ls -la /usr/lib64/openssl/engines-3/pkcs11.so
Почему важно: В некоторых установках путь может отличаться.
Создаём конфигурационный файл для работы с PKCS#11:
cat > /root/pkcs11.cnf << 'EOF' openssl_conf = openssl_init [openssl_init] engines = engine_section [engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 dynamic_path = /usr/lib64/openssl/engines-3/pkcs11.so MODULE_PATH = /usr/lib64/librtpkcs11ecp.so PIN = 123456789 init = 1 EOF
⚠️Важно: Параметр PIN содержит новый пользовательский PIN-код, установленный на Шаге 4. Убедитесь, что он совпадает с вашим фактическим PIN-кодом токена.
Проверяем корректность конфигурации:
cat /root/pkcs11.cnf
Шаг 6: Создание самоподписанного сертификата
Создаём самоподписанный X.509 сертификат, который будет связан с приватным ключом на токене. Сертификат содержит идентифицирующую информацию о пользователе, включая поле CN (Common Name), которое должно совпадать с логином системы для корректной работы маппера opensc.
Проверяем наличие приватного ключа на токене:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 123456789 --list-objects --type privkey
Ожидаемый вывод должен содержать:
Private Key Object; RSA 2048 bits label: user ID: 45
Создаём самоподписанный сертификат, связанный с приватным ключом на токене:
OPENSSL_CONF=/root/pkcs11.cnf openssl req -engine pkcs11 -x509 -new -key 45 -keyform engine -out client.pem -days 365 -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=user/emailAddress=user@mail.com"
Проверяем корректность созданного сертификата:
openssl x509 -in client.pem -text -noout | grep "Subject:"
Шаг 7: Запись сертификата на токен
Записываем созданный самоподписанный сертификат на токен Рутокен ЭЦП, связывая его с ранее созданным приватным ключом через совпадающий идентификатор ID=45. Эта связка «приватный ключ + сертификат» на токене является основой для аутентификации через модуль pam_pkcs11:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 123456789 -y cert -w client.pem --id 45 --label "user"
Проверяем наличие сертификата и приватного ключа на токене:
pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so --login --pin 123456789 --list-objects
Ожидаемый вывод:
Private Key Object; RSA 2048 bits label: user ID: 45 Certificate Object; type = X.509 cert label: user ID: 45
Шаг 8: Настройка конфигурации pam_pkcs11
Создаём основной конфигурационный файл модуля pam_pkcs11, который управляет аутентификацией через токен:
cat > /etc/security/pam_pkcs11/pam_pkcs11.conf << 'EOF'
pam_pkcs11 {
nullok = false;
debug = false;
use_first_pass = false;
use_authtok = false;
card_only = false;
wait_for_card = true;
use_pkcs11_module = rutokenecp;
pkcs11_module rutokenecp {
module = /usr/lib64/librtpkcs11ecp.so;
slot_num = 0;
support_thread = true;
ca_dir = /etc/security/pam_pkcs11/cacerts;
crl_dir = /etc/security/pam_pkcs11/crls;
cert_policy = none;
}
use_mappers = opensc;
mapper_search_path = /lib64/pam_pkcs11;
mapper opensc {
debug = false;
module = /lib64/pam_pkcs11/opensc_mapper.so;
}
}
EOF