(2024-06-20 12:14:18 отредактировано Grey_S)

pcsc_scan не видит рутокен под Альт Линукс

Здравствуйте.

На виртуальный Альт Сервер 10 средствами zVirt проброшен порт с подключенным рутокеном.
При просмотре USB-устройств выдаётся следующее:
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0627:0001 Adomax Technology Co., Ltd QEMU USB Tablet
Bus 001 Device 002: ID 0a89:0030 Aktiv Rutoken ECP
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Библиотеки установлены:
$ sudo rpm -q pcsc-lite-ccid libpcsclite pcsc-tools opensc
pcsc-lite-ccid-1.5.2-alt1.x86_64
libpcsclite-1.9.9-alt1.x86_64
pcsc-tools-1.6.0-alt1.x86_64
opensc-0.24.0-alt1.x86_64

OpenCT не установлен:
$ rpm -q openct
пакет openct не установлен

В Info.plist нужные записи есть.
Тем не менее, pcsc_scan устройство не находит:
$ sudo pcsc_scan
Using reader plug'n play mechanism
Scanning present readers...
Waiting for the first reader... / SCardGetStatusChange: Command cancelled

В режиме отладки pcscd выдаёт следующее:
$ sudo /usr/sbin/pcscd -afd
00000000 [140031843997888] debuglog.c:390:DebugLogSetLevel() debug level=debug
00000040 [140031843997888] utils.c:82:GetDaemonPid() Can't open /var/run/pcscd/pcscd.pid: No such file or directory
00000074 [140031843997888] configfile.l:293:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000023 [140031843997888] configfile.l:329:DBGetReaderListDir() Skipping non regular file: ..
00000005 [140031843997888] configfile.l:369:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000024 [140031843997888] configfile.l:329:DBGetReaderListDir() Skipping non regular file: .
00000005 [140031843997888] pcscdaemon.c:666:main() pcsc-lite 1.9.9 daemon ready.
00002351 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000106 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000099 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000116 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x0627, PID: 0x0001, path: /dev/bus/usb/001/003
00000203 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/002/001
00000078 [140031843997888] winscard_msg_srv.c:256:ProcessEventsServer() Common channel packet arrival
00000011 [140031843997888] winscard_msg_srv.c:267:ProcessEventsServer() ProcessCommonChannelRequest detects: 7
00000005 [140031843997888] pcscdaemon.c:133:SVCServiceRunLoop() A new context thread creation is requested: 7
00003423 [140031827207744] winscard_svc.c:340:ContextThread() Authorized PC/SC client
00000009 [140031827207744] winscard_svc.c:343:ContextThread() Thread is started: dwClientID=7, threadContext @0x55bbaddaece0
00000008 [140031827207744] winscard_svc.c:361:ContextThread() Received command: CMD_VERSION from client 7
00000007 [140031827207744] winscard_svc.c:373:ContextThread() Client is protocol version 4:4
00000004 [140031827207744] winscard_svc.c:396:ContextThread() CMD_VERSION for client 7, rv=SCARD_S_SUCCESS
00000036 [140031827207744] winscard_svc.c:361:ContextThread() Received command: ESTABLISH_CONTEXT from client 7
00000009 [140031827207744] winscard.c:215:SCardEstablishContext() Establishing Context: 0x4CF1F593
00000003 [140031827207744] winscard_svc.c:465:ContextThread() ESTABLISH_CONTEXT for client 7, rv=SCARD_S_SUCCESS
00000062 [140031843997888] winscard_msg_srv.c:256:ProcessEventsServer() Common channel packet arrival
00000018 [140031843997888] winscard_msg_srv.c:267:ProcessEventsServer() ProcessCommonChannelRequest detects: 10
00000006 [140031843997888] pcscdaemon.c:133:SVCServiceRunLoop() A new context thread creation is requested: 10
00002149 [140031802029632] winscard_svc.c:340:ContextThread() Authorized PC/SC client
00000010 [140031802029632] winscard_svc.c:343:ContextThread() Thread is started: dwClientID=10, threadContext @0x55bbadd97490
00000009 [140031802029632] winscard_svc.c:361:ContextThread() Received command: CMD_VERSION from client 10
00000008 [140031802029632] winscard_svc.c:373:ContextThread() Client is protocol version 4:4
00000005 [140031802029632] winscard_svc.c:396:ContextThread() CMD_VERSION for client 10, rv=SCARD_S_SUCCESS
00000027 [140031802029632] winscard_svc.c:361:ContextThread() Received command: ESTABLISH_CONTEXT from client 10
00000009 [140031802029632] winscard.c:215:SCardEstablishContext() Establishing Context: 0x5E492B5C
00000002 [140031802029632] winscard_svc.c:465:ContextThread() ESTABLISH_CONTEXT for client 10, rv=SCARD_S_SUCCESS
00000038 [140031827207744] winscard_svc.c:361:ContextThread() Received command: CMD_GET_READERS_STATE from client 7
00000033 [140031827207744] winscard_svc.c:361:ContextThread() Received command: RELEASE_CONTEXT from client 7
00000007 [140031827207744] winscard.c:229:SCardReleaseContext() Releasing Context: 0x4CF1F593
00000002 [140031827207744] winscard_svc.c:480:ContextThread() RELEASE_CONTEXT for client 7, rv=SCARD_S_SUCCESS
00000028 [140031827207744] winscard_svc.c:354:ContextThread() Client die: 7
00000011 [140031827207744] winscard_svc.c:1071:MSGCleanupClient() Thread is stopping: dwClientID=7, threadContext @0x55bbaddaece0
00000005 [140031827207744] winscard_svc.c:1079:MSGCleanupClient() Freeing SCONTEXT @0x55bbaddaece0
00000006 [140031843997888] winscard_msg_srv.c:256:ProcessEventsServer() Common channel packet arrival
00000020 [140031843997888] winscard_msg_srv.c:267:ProcessEventsServer() ProcessCommonChannelRequest detects: 12
00000003 [140031843997888] pcscdaemon.c:133:SVCServiceRunLoop() A new context thread creation is requested: 12
00002107 [140031793636928] winscard_svc.c:340:ContextThread() Authorized PC/SC client
00000010 [140031793636928] winscard_svc.c:343:ContextThread() Thread is started: dwClientID=12, threadContext @0x55bbaddad970
00000007 [140031793636928] winscard_svc.c:361:ContextThread() Received command: CMD_VERSION from client 12
00000006 [140031793636928] winscard_svc.c:373:ContextThread() Client is protocol version 4:4
00000005 [140031793636928] winscard_svc.c:396:ContextThread() CMD_VERSION for client 12, rv=SCARD_S_SUCCESS
00000032 [140031793636928] winscard_svc.c:361:ContextThread() Received command: ESTABLISH_CONTEXT from client 12
00000006 [140031793636928] winscard.c:215:SCardEstablishContext() Establishing Context: 0x5261E2ED
00000002 [140031793636928] winscard_svc.c:465:ContextThread() ESTABLISH_CONTEXT for client 12, rv=SCARD_S_SUCCESS
00000022 [140031793636928] winscard_svc.c:361:ContextThread() Received command: CMD_GET_READERS_STATE from client 12
00000034 [140031802029632] winscard_svc.c:361:ContextThread() Received command: RELEASE_CONTEXT from client 10
00000009 [140031802029632] winscard.c:229:SCardReleaseContext() Releasing Context: 0x5E492B5C
00000006 [140031802029632] winscard_svc.c:480:ContextThread() RELEASE_CONTEXT for client 10, rv=SCARD_S_SUCCESS
00000026 [140031802029632] winscard_svc.c:354:ContextThread() Client die: 10
00000011 [140031802029632] winscard_svc.c:1071:MSGCleanupClient() Thread is stopping: dwClientID=10, threadContext @0x55bbadd97490
00000002 [140031802029632] winscard_svc.c:1079:MSGCleanupClient() Freeing SCONTEXT @0x55bbadd97490
00000006 [140031843997888] winscard_msg_srv.c:256:ProcessEventsServer() Common channel packet arrival
00000015 [140031843997888] winscard_msg_srv.c:267:ProcessEventsServer() ProcessCommonChannelRequest detects: 7
00000005 [140031843997888] pcscdaemon.c:133:SVCServiceRunLoop() A new context thread creation is requested: 7
00002002 [140031827207744] winscard_svc.c:340:ContextThread() Authorized PC/SC client
00000008 [140031827207744] winscard_svc.c:343:ContextThread() Thread is started: dwClientID=7, threadContext @0x55bbadd97490
00000007 [140031827207744] winscard_svc.c:361:ContextThread() Received command: CMD_VERSION from client 7
00000007 [140031827207744] winscard_svc.c:373:ContextThread() Client is protocol version 4:4
00000004 [140031827207744] winscard_svc.c:396:ContextThread() CMD_VERSION for client 7, rv=SCARD_S_SUCCESS
00000033 [140031827207744] winscard_svc.c:361:ContextThread() Received command: ESTABLISH_CONTEXT from client 7
00000006 [140031827207744] winscard.c:215:SCardEstablishContext() Establishing Context: 0x7C834197
00000003 [140031827207744] winscard_svc.c:465:ContextThread() ESTABLISH_CONTEXT for client 7, rv=SCARD_S_SUCCESS
00000047 [140031793636928] winscard_svc.c:361:ContextThread() Received command: CMD_WAIT_READER_STATE_CHANGE from client 12
00000007 [140031793636928] winscard_svc.c:842:MSGSendReaderStates() Send reader states: 12
^C08903853 [140031843993152] pcscdaemon.c:193:signal_thread() Received signal: 2
00000037 [140031843993152] pcscdaemon.c:227:signal_thread() Preparing for suicide
00001216 [140031843997888] hotplug_libudev.c:709:HPStopHotPluggables() Hotplug stopped
01000230 [140031843997888] readerfactory.c:1377:RFCleanupReaders() entering cleaning function
00000043 [140031843997888] winscard_svc.c:155:ContextsDeinitialize() remaining threads: 2
00000010 [140031843997888] pcscdaemon.c:799:at_exit() cleaning /var/run/pcscd

Подскажите, куда копать?

(2024-06-20 14:26:27 отредактировано Евгений Мироненко)

Re: pcsc_scan не видит рутокен под Альт Линукс

Добрый день!

Спасибо, интересный кейс.
Если нужно быстрое решение, я бы предложил попробовать удалить libpcsclite-1.9.9-alt1.x86_64 и собрать pcsclite с поддержкой libusb, а не libudev (--enable-libusb --disable-libudev при вызове configure).

Наталкивает на предположение, что это поможет, необычная часть лога:

00002351 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000106 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000099 [140031843997888] hotplug_libudev.c:300:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001

get_driver три раза логирует поиск ifd-handler для устройства VID: 0x1D6B, PID: 0x0002, в то время как ожидается, что там будет одна из строк Looking for a driver for VID: 0x0A89, PID: 0x0030. Возможно, с zVirt неправильно отрабатывает эта строчка в pcsclite: https://github.com/LudovicRousseau/PCSC … dev.c#L383

С нашей стороны попробуем проверить работу с zVirt, но это может потребовать немало времени.

Re: pcsc_scan не видит рутокен под Альт Линукс

Спасибо за ответ.
Ещё в zVirt отписались, может там со своей стороны что-то исправят.

Re: pcsc_scan не видит рутокен под Альт Линукс

Воспроизвели окружение:
* Стенд Zvirt 4.0 в режиме Hosted Engine
* VM Альт Сервер 10 (параметры VM на картинке)

uname -a 
Linux localhost 6.1.79-un-def–alt #1 SMP PREEMPT_DYNAMIC Fri Feb 23 18:56:17 UTC x86_64 GNU/Linux
cat /etc/redhat-release
ALT Server 10.2 (Mendelevium)

* Подключение к VM по протоколу SPICE при помощи virt-viewer из Ubuntu 24.04 LTS
* В Консоли VM в Zvirt включены параметры "Включить USB" и "Поддержка смарт-карт" (см. на картинке)
* На ALT Server установлены пакеты:
https://forum.rutoken.ru/uploads/images/2024/07/af52d7031f27d64fc8626c09b2cc1397.jpg

Параметры VM:
https://forum.rutoken.ru/uploads/images/2024/07/764cb368cb242c3016828e99e7b14019.jpg


Настройка проброса USB:
https://forum.rutoken.ru/uploads/images/2024/07/5dca0d7713817ef9763795bdfac1af38.jpg


При запуске virt-viewer console.vv выбираем пробрасываемое устройство Aktiv Rutoken ECP:
https://forum.rutoken.ru/uploads/images/2024/07/e8d532210bab398bde4d5736e58e28e1.jpg


Результат lsusb:
https://forum.rutoken.ru/uploads/images/2024/07/017b6794cb312b2cec357b7518379482.jpg


Результат pcsc_scan:
https://forum.rutoken.ru/uploads/images/2024/07/0a542a0a6a3b971509261ae6f576ef53.jpg


Заявленная проблема не воспроизводится.

Уточните, пожалуйста, чем наш эксперимент отличается от вашего опыта?

(2024-07-26 12:56:32 отредактировано Евгений Мироненко)

Re: pcsc_scan не видит рутокен под Альт Линукс

Добрый день!

К нам поступало еще одно обращение, касающееся проброса токена в виртуальную машину под управлением zVirt. Из этого обращения стал ясен еще один сценарий использования: проброс токена, подключенного к хосту, на котором запущен zVirt, в виртуальную машину, запущенную на этом хосте.

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

Решение проблемы: остановка pcscd на хосте. На ОС с systemd это делается командой sudo systemctl stop pcscd pcscd.socket (см. https://dev.rutoken.ru/pages/viewpage.a … d=94011402).