PKCS#11 Пересылка: Прояснение путаницы между клиентом и сервером

Вопрос или проблема

Я пытаюсь следовать этому руководству 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 Подключения: Разъяснение Клиента и Сервера

Интеграция PKCS#11 через подключение может быть сложной задачей, особенно когда речь идет о различии между клиентом и сервером. Давайте разберем ваш вопрос, чтобы прояснить эти моменты, опираясь на ваш сценарий работы с p11-kit.

Как определить сервер PKCS#11?

Из вашего описания следует, что ваш "локальный компьютер" (машина A) играет роль сервера PKCS#11. В данном контексте под "сервером" подразумевается устройство, которое непосредственно взаимодействует с токеном (например, смарт-картой, эмулируемой с помощью SoftHSM). Для успешного выполнения этого действия необходимо запустить серверный процесс p11-kit server, обеспечивая доступ к соответствующему провайдеру PKCS#11 на локальной машине.

Пример шагов для настройки:

  1. Создайте необходимый исполняемый контекст:

    export XDG_RUNTIME_DIR=/tmp/$(id -u)-today
    mkdir -p $XDG_RUNTIME_DIR && chmod 700 $XDG_RUNTIME_DIR
  2. Запустите сервер:

    p11-kit server --provider /usr/local/lib/softhsm/libsofthsm2.so "pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=...;token=mimi"

В результате выполнения этих действий ваш локальный компьютер A станет сервером PKCS#11, который управляет доступом к токенам.

Как определить клиента PKCS#11?

Клиент PKCS#11 определяется как машина или процесс, который запрашивает доступ к серверу PKCS#11. В вашем сценарии это "удаленный хост" (машина B). Когда вы выполняете команду SSH с параметром -R, вы создаете обратное подключение, позволяющее удаленному хосту взаимодействовать с локальным сервером PKCS#11 на машине A.

Порядок выполнения:

  1. Если вы, например, хотите перенаправить сокет на удаленный хост:
    ssh -R /tmp/0-nginx/p11-kit/pkcs11:${P11_KIT_SERVER_ADDRESS#*=} user@[remote_host]

Здесь /tmp/0-nginx/p11-kit/pkcs11 на машине B будет служить клиентским интерфейсом для доступа к токену на машине A.

Проблемы с отображением токенов на удаленной машине

При выполнении команды p11tool на машине B вы не видите токены, так как, возможно, не правильно настроено подключение или не установлен нужный провайдер. Основные моменты, которые стоит проверить:

  1. Проверьте, запущен ли сервер:
    Убедитесь, что вы запустили сервер p11-kit на локальной машине A и он работает, как ожидалось.

  2. Проверьте пользовательские права:
    Убедитесь, что у вас есть все необходимые права доступа для создания и использования сокета в папке /tmp/0-nginx/p11-kit/ на удаленном хосте B.

  3. Настройте клиентский провайдер:
    Убедитесь, что плагин p11-kit-client.so доступен и правильно настроен на удаленной машине. Попробуйте следующий пример команды:

    p11tool --provider /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-client.so --list-tokens
  4. Проверьте все шаги подключения SSH:
    Убедитесь, что команда SSH прошла успешно и сокеты правильно ссылаются друг на друга.

Заключение

Подходя к вопросу определения ролей клиента и сервера PKCS#11, ваш локальный компьютер A является сервером, а удаленный хост B выступает в роли клиента, который подключается к этому серверу для доступа к его токенам. Пройдите все предложенные шаги по отладке и проверьте конфигурации еще раз, чтобы устранить возникшие проблемы с отображением токенов на удаленной машине.

Оцените материал
Добавить комментарий

Капча загружается...