Подробный гайд: Диагностика SSSD, если он не видит сертификаты на РуТокен ЭЦП 3.0 NFC - Часть 1
В конфигурации самая вероятная причина уже видна — это строка p11_uri.
p11_uri = PKCS11:model=Rutoken%20ECP%20NFC;serial=424a928f
Для SSSD это не просто подсказка, а фильтр:
p11_child будет искать сертификаты только на PKCS#11-токене, у которого совпадают указанные атрибуты model, serial и т.п. РуТокен ЭЦП 3.0 NFC и РуТокен ЭЦП 2.0 часто отличаются тем, как они представляются через PKCS#11: model, token label, serial, доступность атрибутов до входа, объектность сертификатов и ключей. Поэтому один токен проходит фильтр и содержит видимые объекты, а второй — нет.
1. Как вообще работает сертификатная аутентификация в SSSD
Упрощённо цепочка такая:
- PAM вызывает
pam_sss. - SSSD запускает
p11_child. p11_childчерезp11-kit/PKCS#11 открывает токен.- Применяется фильтр
p11_uri, если он задан. - Ищутся объекты:
- сертификат
CKO_CERTIFICATE; - приватный ключ
CKO_PRIVATE_KEY.
- сертификат
- Сертификат должен быть:
- видим через PKCS#11;
- понятен OpenSSL/NSS;
- проверен по цепочке доверия;
- сопоставлен с пользователем AD.
- Если сертификат найден, но нет подходящего приватного ключа, SSSD обычно такой вариант не использует.
- Дальше уже идёт Kerberos/PKINIT или другой механизм аутентификации.
На практике сообщение «SSSD не видит сертификат» может означать любую из этих проблем:
- токен не совпал по
p11_uri; - PKCS#11-модуль не видит токен;
- сертификат невидим без входа или хранится в админской области;
- сертификат есть, но нет приватного ключа с тем же
CKA_ID; - сертификат ГОСТ, а OpenSSL/Kerberos/SSSD в вашей сборке его не обрабатывает;
- цепочка сертификата не проверяется;
- сертификат найден, но не маппится на пользователя AD;
- PAM-сервис не разрешён в
pam_p11_allowed_services.
2. Самая вероятная причина у вас: жёсткий p11_uri
У вас задано:
p11_uri = PKCS11:model=Rutoken%20ECP%20NFC;serial=424a928f
Это означает: искать только токен с моделью Rutoken ECP NFC и серийным номером 424a928f.
Для РуТокен ЭЦП 3.0 NFC атрибуты могут быть, например:
model: Rutoken ECP 3.0 NFC
label: Rutoken ECP 3.0 NFC
serial: другой
Либо серийный номер присутствует, но не читается до C_Login, либо строка модели отличается. В итоге p11_child просто не считает, что это нужный токен.
Быстрая проверка
Временно уберите фильтр:
[pam]
pam_cert_auth = True
p11_child_timeout = 240
pam_cert_db_path = /etc/ssl/certs/ca-certificates.crt
pam_p11_allowed_services = +cinnamon-screensaver,+mate-screensaver,+lightdm
#p11_uri = PKCS11:model=Rutoken%20ECP%20NFC;serial=424a928f
debug_level=10
Затем:
sssctl config-check
systemctl restart sssd
Попробуйте вход или разблокировку. Если после этого РуТокен ЭЦП 3.0 NFC стал виден — причина именно в p11_uri.
3. Как правильно задать p11_uri для РуТокен ЭЦП 3.0 NFC
Сначала нужно узнать реальные атрибуты токена.
Установите инструменты, если их нет:
apt install pcscd pcsc-tools libccid gnutls-bin p11-kit
Проверьте токены:
p11-kit list-tokens
Или удобнее:
p11tool --list-tokens
Пример вывода:
Token 0:
URL: pkcs11:model=Rutoken%20ECP%203.0%20NFC;manufacturer=Aktiv%20Co.;serial=XXXXXXXX;token=Rutoken%20ECP%203.0%20NFC
Type: Hardware token
Manufacturer: Aktiv Co.
Model: Rutoken ECP 3.0 NFC
Serial: XXXXXXXX
Module: /usr/lib/x86_64-linux-gnu/librtpkcs11ecp.so
Именно строку URL надо использовать как основу.
Например:
p11_uri = pkcs11:model=Rutoken%20ECP%203.0%20NFC
или, если нужно жёстко привязаться к конкретному токену:
p11_uri = pkcs11:serial=XXXXXXXX;model=Rutoken%20ECP%203.0%20NFC
или по метке токена:
p11_uri = pkcs11:token=Rutoken%20ECP%203.0%20NFC
Важно:
- пробелы кодируйте как
%20; - регистр серийного номера может иметь значение;
- лучше использовать строчный вариант
pkcs11:; - не задавайте серийный номер «от другого токена».
Если у вас в системе могут использоваться и ЭЦП 2.0, и ЭЦП 3.0, не привязывайтесь к одному серийному номеру. Лучше либо убрать p11_uri, либо использовать только модель/производителя, если это допустимо политикой безопасности.
4. Проверка, что токен вообще виден через PKCS#11
Найдите библиотеку РуТокен:
find /usr/lib /lib -name 'librtpkcs11ecp*.so*' 2>/dev/null
Обычно путь один из:
/usr/lib/librtpkcs11ecp.so
/usr/lib/x86_64-linux-gnu/librtpkcs11ecp.so
/usr/lib/aarch64-linux-gnu/librtpkcs11ecp.so
Задайте переменную:
MOD=/usr/lib/x86_64-linux-gnu/librtpkcs11ecp.so
Проверьте слоты:
pkcs11-tool --module "$MOD" --list-slots
Или:
pkcs11-tool --module "$MOD" --list-token-slots
Если токен не виден, проверяйте pcscd.
systemctl status pcscd
systemctl restart pcscd
pcsc_scan
В pcsc_scan токен должен появляться при подключении.
Если pcsc_scan не видит РуТокен:
- Проверьте другой USB-порт.
- Избегайте USB-хабов.
- Если это NFC-исполнение, попробуйте подключить как обычный контактный токен.
- Обновите пакеты
pcscd,libccid. - Проверьте
lsusb:
lsusb | grep -i Aktiv
5. Проверка сертификата и приватного ключа на токене
Очень важный момент: SSSD нужен не просто сертификат, а пара «сертификат + доступный приватный ключ».
Проверьте сертификаты без входа:
pkcs11-tool --module "$MOD" --list-objects --type cert
Потом с PIN-пользователя:
pkcs11-tool --module "$MOD" --login --pin 'ВАШ_PIN' --list-objects --type cert
Проверьте приватные ключи:
pkcs11-tool --module "$MOD" --login --pin 'ВАШ_PIN' --list-objects --type privkey
Сравните ID и label у сертификата и приватного ключа.
Пример условно:
Certificate Object; type = X.509 cert
label: user
ID: 01
Private key object; type = EC key
label: user
ID: 01
Если:
- сертификат виден только с администраторским PIN;
- сертификат виден, а приватный ключ нет;
- у сертификата и ключа разные
ID; - ключ не имеет признаков использования для подписи;
то SSSD может не использовать такой сертификат.
В этом случае нужно корректно записать пару на токен так, чтобы:
- Объекты были доступны пользователю, не только администратору токена.
- Сертификат был виден через обычный пользовательский PIN.
- Приватный ключ был на том же токене.
CKA_IDсертификата и ключа совпадали.- Ключ имел атрибуты для подписи/аутентификации.
Если вы используете инструменты РуТокен, пишите сертификат и ключ как связанную пару, с одинаковым идентификатором/меткой.
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.