Аппаратный ключ 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 может выглядеть следующим образом:
Это иллюстративный URI. Реальное значение получают из списка объектов тестового токена. Не помещайте PIN непосредственно в URI, особенно если он попадёт в конфигурацию веб-сервера или журнал.
Если PKCS#11 Provider сконфигурирован:
Список объектов может содержать метки организации и сотрудников. Не публикуйте его без очистки.
Как проходит подпись¶
Приложение открывает сертификат или ключ по URI, вызывает OpenSSL EVP/STORE, PKCS#11 Provider находит объект на токене и запускает подходящий механизм подписи. Закрытый ключ остаётся на носителе. Перед использованием ГОСТ-ключа проверяйте, что конкретная связка OpenSSL Provider ↔ модуль токена поддерживает тот же алгоритм и параметры, что и сертификат.
Практический порядок внедрения¶
- Выполните обнаружение токена.
- Проверьте ГОСТ-механизмы конкретного модуля.
- Создайте тестовый ключ с политикой запрета экспорта.
- Получите и зарегистрируйте сертификат.
- Настройте PKCS#11 Provider в изолированной конфигурации OpenSSL.
- Подпишите тестовое сообщение и проверьте результат вторым инструментом.
- Только после этого подключайте ключ к Nginx, приложению или УЦ.