Вопрос или проблема
Я пытаюсь следовать этому руководству https://p11-glue.github.io/p11-glue/p11-kit/manual/remoting.html, но есть много моментов, которые меня вводят в заблуждение.
- Какой из сторон является сервером pkcs11?
Сказано: “Настройка сервера пересылки PKCS#11 на локальном клиенте”. Так я понимаю, что моя локальная машина выступает в роли p11 сервера, который напрямую соединяется со смарт-картой (в дальнейшей настройке я использую softhsm в качестве смарт-карты). Упоминается
P11_KIT_SERVER_ADDRESS
, но команда выполняется на “локальном клиенте”, что вызывает путаницу.
- Какой из сторон является клиентом pkcs11?
В разделе “Подготовка удаленной системы для пересылки сокетов PKCS#11”. “Пересылка сокета PKCS#11”, они определяют директорию времени выполнения пользователя, но одна из операций выполняется с помощью “ssh”. Поэтому я думал, что
директория времени выполнения
находится на удаленной системе. (Они также используют терминыудаленный сервер
илиудаленный хост
)
Как указано ниже, я описываю шаг за шагом, что я сделал в 2 контейнерах, A – как моя локальная машина, и B – как удалённый хост. Я использую softhsm для имитации смарт-карты. На локальной машине A:
$ p11tool --list-tokens
Token 0:
URL: pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust
Label: System Trust
Type: Trust module
Flags: uPIN uninitialized
Manufacturer: PKCS#11 Kit
Model: p11-kit-trust
Serial: 1
Module: p11-kit-trust.so
Token 1:
URL: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=d1472478b9829554;token=mimi
Label: mimi
Type: Generic token
Flags: RNG, Requires login
Manufacturer: SoftHSM project
Model: SoftHSM v2
Serial: d1472478b9829554
Module: /usr/local/lib/softhsm/libsofthsm2.so
Итак, на машине A доступны 2 токена. Мне также нужно создать директорию времени выполнения на локальном хосте. В противном случае возникает ошибка, когда я делаю p11-kit server --provider ...
export XDG_RUNTIME_DIR=/tmp/$(id -u)-today
mkdir -p $XDG_RUNTIME_DIR
chmod 700 $XDG_RUNTIME_DIR
p11-kit server --provider /usr/local/lib/softhsm/libsofthsm2.so "pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=01165599c52ea1fe;token=mimi"
P11_KIT_SERVER_ADDRESS=unix:path=/tmp/0-today/p11-kit/pkcs11-73; export P11_KIT_SERVER_ADDRESS;
P11_KIT_SERVER_PID=74; export P11_KIT_SERVER_PID;
На удаленном хосте – B (172.18.0.3):
root@1de661b77dbd:~# export XDG_RUNTIME_DIR=/tmp/$(id -u)-nginx
root@1de661b77dbd:~# mkdir -p $XDG_RUNTIME_DIR && chmod 700 $XDG_RUNTIME_DIR
root@1de661b77dbd:~# systemd-path user-runtime
/tmp/0-nginx
root@1de661b77dbd:~# systemctl enable p11-kit-client.service
Не удалось включить юнит, юнит p11-kit-client.service не существует.
root@1de661b77dbd:~# systemctl list-unit-files | grep p11
p11-kit-client.service enabled enabled
root@1de661b77dbd:~# mkdir /tmp/0-nginx/p11-kit
Я попытался сделать ssh с A на машину B с ssh -R /tmp/0-nginx/p11-kit/pkcs11:${P11_KIT_SERVER_ADDRESS#*=} [email protected]
, но получил предупреждение, поэтому мне нужно было создать /tmp/0-nginx/p11-kit
на B, после чего предупреждение исчезло. С Машины A
root@b1d0c05c4ec6:~# ssh -R /tmp/0-nginx/p11-kit/pkcs11:${P11_KIT_SERVER_ADDRESS#*=} [email protected]
и затем
root@1de661b77dbd:~# ls -l /tmp/0-nginx/p11-kit/pkcs11
srw------- 1 root root 0 Oct 17 10:56 /tmp/0-nginx/p11-kit/pkcs11
p11tool --provider /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-client.so --list-tokens
p11tool --provider /usr/local/lib/pkcs11/p11-kit-client.so --list-tokens
=> Никакие токены не отображаются с p11-kit-client.so
на удаленной машине.
Я ошибся на каком-либо из шагов? Почему токены не отображаются на удаленной машине при использовании p11-kit-client.so?
Ответ или решение
PKCS#11 Forwarding: Разъяснение путаницы между клиентом и сервером
Вопрос, который вы поднимаете, касается важной концепции PKCS#11 — стандарта для криптографических токенов, таких как умные карты. Давайте подробно рассмотрим, что подразумевается под клиентом и сервером в этом контексте, а также проанализируем шаги, которые вы предприняли, и причину, по которой токены не отображаются на удаленном хосте.
Определения: клиент и сервер PKCS#11
-
PKCS#11 сервер: В контексте вашего вопроса, ваш локальный компьютер (машина A) фактически выступает в роли сервера PKCS#11. Это связано с тем, что именно на локальной машине вы запускаете p11-kit сервер, который взаимодействует с вашим смарт-картой (или в данном случае с эмуляцией смарт-карты через SoftHSM).
-
PKCS#11 клиент: Под клиентом PKCS#11 понимается удалённый хост (машина B), который, в свою очередь, отправляет запросы к серверу PKCS#11 (вашей локальной машине) для доступа к токенам через установленный канал связи (в данном случае через SSH).
Шаги и идентификация проблем
Вы выполнили следующие шаги, чтобы настроить системную связь между вашим локальным сервером и удалённым клиентом. Давайте проанализируем их:
-
Настройка локального сервера (машина A):
- Вы правильно создали окружение для сервера p11-kit, установили адрес P11_KIT_SERVER_ADDRESS и запустили сервер. Это настраивает взаимодействие с вашим смарт-картой SoftHSM.
-
Настройка удаленного клиента (машина B):
- Вы корректно создали директорию XDG_RUNTIME_DIR и подгрузили услуги системы, чтобы они могли работать с вашими запросами.
- Описание использования SSH для создания удалённого канала действительно указывает, что на удалённом хосте должна быть доступна директория, куда будет перенаправлен сокет.
Проблема с отображением токенов
Отсутствие токенов при выполнении команды p11tool --provider /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-client.so --list-tokens
на удалённом хосте означает, что у клиента нет доступа к информации о токенах на сервере. Возможные причины:
-
Проблемы с доступом через сокет: Убедитесь, что сокет действительно создан и доступен на удаленной машине. Вы можете попробовать выполнить команду
ls -l /tmp/0-nginx/p11-kit/pkcs11
и убедиться, что параметры сокета выполнены корректно (доступ и права на сокет могут вызвать проблемы). -
Не корректная настройка p11-kit-client: Убедитесь, что на удаленной машине установлен правильный клиент p11-kit и что он может видеть и взаимодействовать с установленным сервером. Попробуйте запустить сервер и клиент в режиме отладки для получения дополнительных логов, чтобы выяснить, происходит ли какое-либо взаимодействие.
-
Правильность переправки адреса сокета: При запуске SSH запустите, например, команду
ssh -R /tmp/0-nginx/p11-kit/pkcs11:${P11_KIT_SERVER_ADDRESS#*=} <user>@<remote-host>
. Убедитесь, что переменная P11_KIT_SERVER_ADDRESS правильно передается и что сервер, который вы указали, записан в правильном формате.
Заключение
Ваша настройка PKCS#11 forwarding требует внимательного подхода из-за потенциальных источников путаницы между клиентом и сервером. Убедитесь, что все шаги выполнены последовательно и корректно. Проверьте доступы и корректные версии использования p11-kit как на клиенте, так и на сервере. Если проблема остается, попробуйте задействовать дополнительные инструменты для диагностики соединений и прав доступа.
Дополнительным методом диагностики может стать использование различных отладочных опций, поддерживаемых pkcs11 и плагинами p11-kit для большей прозрачности в работе с токенами.