275просмотров
14 января 2026 г.
statsScore: 303
PKCS11 для Secure Enclave Почти во всех современных компьютерах есть специальные крипточипы. Они (помимо всего прочего) позволяют неизвлекаемо хранить асимметричные ключики для подписи/key negotiation. Один из самых распространенных подходов к этому всему — TPM2. Про то, как их можно использовать под Linux, я даже как-то рассказывал. Хотим работать с TPMами как с ключницей - берем tpm2-pkcs11 (где PKCS11 - стандарт работы с криптожелезяками) и пользуемся. У Apple... все не как у всех, к сожалению. На современных устройствах на M чипах криптопроцессор - Secure Enclave. Модель работы с ним не ложится на модель работы с TPM2. Нестандартные интерфейсы, привязка к Apple'овым идентификаторам приложений — "кто ключ нагенерировал, тот им и пользуется". Запутанная экосистема. Например, существует такой фреймворк, как CryptoTokenKit, но это не интерфейс к Secure Enclave, это с точностью до наоборот — способ предоставить приложениям из экосистемы Apple (e.g. Safari) доступ до вашего криптотокена. PKCS11 отсутствует. Если у вас generic софт (ssh, gpg, git, openvpn), то он, вероятно, не умеет работать с ключами на Secure Enclave. Есть разрозненные решения (например, для ssh), но мне же очень, очень хотелось завести openvpn с ключами на SE. Идея появилась практически ровно год назад и начал я с попытки реализации PKCS11 интерфейса к SE. Идея проста — делаем программу-демон которая взаимодействует с SE и какой-то интерфейс к ней (unix socket, XPC); сошник (...точнее, dylib) с PKCS11 имплементацией, которая просто общается с этим демоном. Подсовываем PKCS11 к openvpn; профит. Тогда за 3 дня разработки я не справился, сгорел и отложил в дальний ящик. Где-то через полгода листал на досуге ман на openvpn (as one does) и наткнулся на вот это: --management-external-cert certificate-hint Allows usage for external certificate instead of --cert option (client-only). certificate-hint is an arbitrary string which is passed to a management inter‐ face client as an argument of NEED-CER‐ TIFICATE notification. Requires --man‐ agement-external-key. --management-external-key args Allows usage for external private key file instead of --key option (client-only). Можно заставить OpenVPN подписывать TLS хендшейк не самому, а чтобы он попросил management программу. Реализовать management интрефейс openvpn оказалось в разы проще чем PKCS11 и за сутки я получил готовую, работающую имплементацию. И опять забыл про это. На днях вернулся, глянул на код и все-таки написал PKCS11 поверх реализации для management интерфейса. Засунул в CI с подписями и нотаризацией от Apple. Работает. Насколько мне известно, это первый PKCS11 интерфейс к Secure Enclave (вставить анекдот про неуловимого Джо) https://github.com/ne-bknn/nailed P.S. большим разочарованием было то, что Apple не поддерживает аттестацию ключей с Secure Enclave. Ну, точнее, поддерживает, но только для себя.