Архивирование клиентских ключей
Ключи подписи хранящиеся на устройстве пользователя могут быть сохранены на сервере в виде архивных копий. Архивные копии ключей подписи, сохраненные на сервере, могут быть загружены на устройство пользователя.
Примечание
Архивные копии могут быть созданы только для ключей, которые были созданы с флагом EXPORTABLE. Неэкспортируемые ключи подписи (например ключи созданные на ФКН) не могут быть архивированы.
Примечание
Все ранее создаваемые ключи подписи создавались как неэкспортируемые.
Для создания экспортируемых ключей в метод крипто библиотеки createKeyEx
добавлен флаг is_exportable.
Архивированы могут быть ключи, у которых выставлен флаг IsClient:true
в объекте Certificate.
Дополнительно необходимо проверить является ли ключ подписи экспортируемым с помощью функции крипто библиотеки isExportable
.
Для проверки сохранена ли архивная копия ключа на сервере необходимо получить список сертификатов и
проверить флаг isArchived
у объекта Certificate.
Дополнительно пользователь может защитить архивную копию на ПИН-коде. ПИН-код может быть задан при создании архивной копии и соответственно должен быть указан при получении архивной копии. Если пользователь забыл ПИН-код архивной копии, то восстановить его будет нельзя. Необходимо будет удалить архивную копию и создать ее повторно. По умолчанию архивная копия защищается на системном пароле (прозрачно для пользователя).
Для работы с архивными ключами MDAG предоставляет методы:
Для работы с архивными ключами крипто библиотека предоставляет функции:
importPFX
- Функция импорта ключа из PFXexportPFX
- Функция экспорта ключа в PFXisExportable
- Функция проверки экспортируемости ключа
Для создания экспортируемых ключей в функцию крипто библиотеки createKeyEx
добавлен флаг is_exportable.
Аналогично при импорте ключа из PFX в функции importPFX
можно указать флаг is_exportable.
Между сервером и клиентом экспортируемый ключ передается в PFX. Для защиты PFX используется пароль вырабатываемый с помощью
ключа пользователя KConf
и случайных данных. В качестве случайных данных берется значение nonce
передаваемое в заголовке аутентификации.
Соответственно при создании архивной копии и при получении архивной копии необходимо использовать одно и тоже значение nonce
для
вызова методов крипто библиотеки importPFX
, exportPFX
и вычислении заголовка аутентификации.
Последовательность действий при создании архивной копии
Открытие ключевого контейнера
openContainer
В результате метод возвращает открытый хэндл криптопровайдера и ключа подписи hSigningProv, hSigningKey.(опционално) Проверка является ли ключ экспортируемым
isExportable
Выработка случайных данных
genNonce
. В результате вырабатывается 32-байта случайных данных (nonce
).Открытие ключа KConf
importEncryptedKey
В результате метод возвращает открытый хэндл ключа KConfЭкспорт ключа в PFX
exportPFX
В вызове метода необходимо указать хэндл криптопровайдера и ключа подписи hSigningProv, hSigningKey, хэндл ключа KConf и случайные данные, для выработки пароляnonce
. Для определения размера буфера для записи PFX метод необходимо вызвать 2-а раза. Если первый вызов завершится с кодом 234 (ERROR_MORE_DATA), то необходимо выделить буфер указанного размера и вызвать метод повторно.Отправка PFX на сервер Создание архивное копии ключа Заголовок аутентификации вычисляется штатно. Но значение поля
nonce
должно быть взято с шага 3.
Последовательность действий при получении архивной копии
Открытие ключа KConf
importEncryptedKey
В результате метод возвращает открытый хэндл ключа KConfВыработка случайных данных
genNonce
. В результате вырабатывается 32-байта случайных данных (nonce
).Получение PFX с сервера Получение архивной копии ключа Заголовок аутентификации вычисляется штатно. Но значение поля
nonce
должно быть взято с шага 2.Импорт ключа из PFX
importPFX
В вызове метода необходимо указать хэндл ключа KConf и случайные данный полученные на шаге 2. Так же в методе передается набор данных аналогичный методуcreateKeyEx
. Метод создает новый ключевой контейнер.
SDK должно самостоятельно проверить, что на устройстве нет ранее созданного контейнера с данным ключом. Т.е. избежать дублирования ключевых контейнеров на одном устройстве.