Перейти к содержанию

Аппаратный ключ PKCS#11 в OpenSSL

OpenSSL использует интерфейс Provider. Для обращения к ключу токена нужен PKCS#11 Provider, который передаёт операции модулю устройства; для математических ГОСТ-алгоритмов используется совместимый криптографический Provider. Один Provider не заменяет другой.

Сначала убедитесь, что компоненты доступны

openssl list -providers
p11-kit list-modules
find /usr/lib /usr/lib64 -iname '*pkcs11*.so' 2>/dev/null

Проверьте, что среди модулей OpenSSL присутствует именно PKCS#11 Provider. Установленный p11-kit или opensc-pkcs11.so не равен автоматически установленному pkcs11-provider OpenSSL.

Upstream openssl-projects/pkcs11-provider описывает его загрузку, конфигурацию модуля и использование URI ключа.

Идентификация ключа

В PKCS#11 URI можно выбрать токен, объект, идентификатор ключа и тип объекта. URI может выглядеть следующим образом:

pkcs11:token=NiceOS-Test;object=Server-Key;type=private

Это иллюстративный URI. Реальное значение получают из списка объектов тестового токена. Не помещайте PIN непосредственно в URI, особенно если он попадёт в конфигурацию веб-сервера или журнал.

Если PKCS#11 Provider сконфигурирован:

openssl storeutl -keys 'pkcs11:'

Список объектов может содержать метки организации и сотрудников. Не публикуйте его без очистки.

Как проходит подпись

Приложение открывает сертификат или ключ по URI, вызывает OpenSSL EVP/STORE, PKCS#11 Provider находит объект на токене и запускает подходящий механизм подписи. Закрытый ключ остаётся на носителе. Перед использованием ГОСТ-ключа проверяйте, что конкретная связка OpenSSL Provider ↔ модуль токена поддерживает тот же алгоритм и параметры, что и сертификат.

Практический порядок внедрения

  1. Выполните обнаружение токена.
  2. Проверьте ГОСТ-механизмы конкретного модуля.
  3. Создайте тестовый ключ с политикой запрета экспорта.
  4. Получите и зарегистрируйте сертификат.
  5. Настройте PKCS#11 Provider в изолированной конфигурации OpenSSL.
  6. Подпишите тестовое сообщение и проверьте результат вторым инструментом.
  7. Только после этого подключайте ключ к Nginx, приложению или УЦ.

Применение аппаратного ключа в Nginx.