Подробный гайд: pcsc_scan не видит Рутокен на Альт Линукс в ВМ zVirt - Часть 1
Ключевой момент из логе
hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B ...
hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x0627 ...
pcscd перечисляет устройства через libudev, но ни разу не пытается посмотреть драйвер для VID 0x0A89 / PID 0x0030, то есть для самого Рутокена.
Это значит, что проблема, скорее всего, не в Info.plist и не в openct, а в том, что устройство не попадает в pcscd как USB-устройство/интерфейс смарт-карты.
Обычно это одна из трёх причин:
- Рутокен проброшен в zVirt некорректно или работает в нестабильном режиме.
- Устройство не имеет активного интерфейса класса
0x0b/Smart Card. udev/authorized/ SELinux /usbguardне отдают устройство вpcscd.
1. Быстрая проверка: видит ли система Рутокен как смарт-карту
Выполните:
lsusb -t
Найдите строку с Рутокеном.
В идеале должно быть что-то вроде:
Class=Smart Card
или в выводе lsusb -v интерфейс должен иметь класс 0x0b.
Затем:
sudo lsusb -v -d 0a89:0030
В выводе важно найти блок интерфейса.
Для нормальной работы через pcsc-lite-ccid нужно что-то подобное:
Interface Descriptor:
bInterfaceClass 0x0b Smart Card
bInterfaceSubClass 0x00
bInterfaceProtocol 0x00
Хорошо, если есть:
bNumConfigurations 1
bConfigurationValue 1
Если вместо 0x0b видите, например:
bInterfaceClass 0xff Vendor Specific
или:
bInterfaceClass 0x08 Mass Storage
или:
bInterfaceClass 0x03 Human Interface Device
то обычный pcsc-lite-ccid такое устройство как смарт-карту не увидит. Тогда проблема в режиме работы токена или нужен специализированный драйвер Рутокен.
2. Проверить, что ядро нормально распознало устройство при пробросе
В одном терминале запустите:
sudo dmesg -wH
Затем в интерфейсе zVirt отключите Рутокен от ВМ и подключите его заново.
В dmesg ожидаются примерно такие строки:
usb 1-1: new full-speed USB device number 2 using xhci_hcd
usb 1-1: New USB device found, idVendor=0a89, idProduct=0030
usb 1-1: New USB device strings: ...
usb 1-1: Product: Rutoken ECP
...
config 1 interface 0 altsetting 0 class 11
Ключевое:
class 11
11 в шестнадцатеричной записи — это 0x0b, то есть Smart Card.
Если в dmesg есть ошибки вроде:
device descriptor read/64, error -71
device not accepting address
unable to enumerate USB device
no configuration found
device not accepting configuration
reset full-speed USB device
то проблема, скорее всего, в пробросе через zVirt, контроллере, питании или скорости устройства.
3. Проверить, есть ли устройство в /sys и есть ли у него интерфейс
Выполните:
DEV=$(grep -l 0a89 /sys/bus/usb/devices/*/idVendor 2>/dev/null | head -n1 | xargs -r dirname)
echo "DEV=$DEV"
Если вывод пустой:
DEV=
то устройство не видно в /sys/bus/usb/devices, хотя lsusb его показывает. В таком случае pcscd его через libudev не увидит. Это почти всегда проблема проброса или состояния устройства.
Если путь найден, выполните:
if [ -n "$DEV" ]; then
echo "$DEV"
cat "$DEV/bConfigurationValue" 2>/dev/null
cat "$DEV/authorized" 2>/dev/null
cat "$DEV/speed" 2>/dev/null
ls -d "$DEV":* 2>/dev/null
for i in "$DEV":*; do
echo "$i"
cat "$i/bInterfaceClass" 2>/dev/null
done
fi
Ожидаемый хороший вариант:
/sys/bus/usb/devices/1-1
1
1
12
/sys/bus/usb/devices/1-1:1.0
0b
То есть:
- устройство найдено;
bConfigurationValue = 1;authorized = 1;- есть интерфейс вида
1-1:1.0; bInterfaceClass = 0b.
Если:
bConfigurationValue = 0
или интерфейсов нет:
ls -d "$DEV":*
ничего не выводит, значит устройство не сконфигурировано. В этом случае pcscd не увидит его как смарт-карту. Обычно это решается переподключением, сменой проброса, сменой USB-контроллера в ВМ или исправлением ошибки проброса.
4. Проверить udev
Проверьте, активен ли systemd-udevd:
systemctl is-active systemd-udevd
Должно быть:
active
Затем, если DEV был найден:
udevadm info --query=property --path="$DEV"
И для интерфейса:
for i in "$DEV":*; do
echo "=== $i ==="
udevadm info --query=property --path="$i" 2>/dev/null
done
Для интерфейса смарт-карты желательно видеть что-то вроде:
INTERFACE=11/0/0
или похожие свойства, указывающие на класс 11 в шестнадцатеричном виде.
Можно также посмотреть события в реальном времени:
sudo udevadm monitor --property
Затем снова переподключите Рутокен в zVirt. При подключении должны появляться события add для USB-устройства и USB-интерфейса. Если событий нет или нет интерфейса — pcscd устройство не получит.
Иногда помогает:
sudo udevadm control --reload
sudo udevadm trigger --action=add --subsystem-match=usb
sudo udevadm settle
Если это допустимо на вашем сервере, можно перезапустить systemd-udevd:
sudo systemctl restart systemd-udevd
Но на продакшене это лучше согласовать, так как может повлиять на другие устройства.
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.