Управление несколькими ключами/сертификатами RSA в структуре PKCS#12.

Я пытаюсь управлять в библиотеке C несколькими ключами и сертификатами RSA в структуре PKCS # 12. Управление одним ключом с помощью примитивов PKCS12_create и PKCS12_parse работает нормально, но я ничего не могу найти об управлении несколькими ключами. Я пытался использовать примитивы сейфов и сумок, но мне удалось повредить только мой PKCS12.

Разрешает ли OpenSSL PKCS#12 несколько ключей и сертификатов в структуре PKCS#12? Если да, то как мне управлять несколькими ключами и сертификатами с помощью API PKCS#12?

Спасибо всем


person Yann Delanoe    schedule 16.06.2017    source источник
comment
Итак, вы хотите создать пару ключей RSA с API libcrypto? Или вы хотите хранить несколько пар ключей?   -  person Badda    schedule 16.06.2017
comment
Привет Бадда. Я хочу хранить и анализировать несколько пар ключей в одной структуре/файле PKCS12. Создание пары ключей RSA в порядке.   -  person Yann Delanoe    schedule 16.06.2017


Ответы (2)


PKCS#12 — это сложная структура данных. Все операции, которые использует PKCS12_parse, являются общедоступным API, он просто пытается упростить простой случай. Все 245 строк p12_kiss.c (одна предполагает Keep It Simple, Stupid) — это PKCS12_parse и его (не общедоступные) вспомогательные процедуры.

p12_crt.c — это еще 291 строка "man , этот формат файла сложен", что равно PKCS12_create.

Управление несколькими файлами — это более простой код, но если вы хотите внести сложность в свой код, вы можете упростить операции с файлами.

Не забудьте позвонить PKCS12_SAFEBAG_create_pkcs8_encrypt по поводу сумок с закрытыми ключами. Ваши ключи не зашифрованы, если вы их не вызовете, и (IIRC) устройство чтения PFX от Apple не будет загружать ключи из незашифрованных сумок (вероятно, это не преднамеренное решение, они, вероятно, никогда не сталкивались с этим).

person bartonjs    schedule 16.06.2017
comment
Привет бартонж. Спасибо за хороший ответ. Наконец-то мне удалось проанализировать несколько ключей (добавленных с помощью keytool) и выбрать тот, который мне нужен, в зависимости от его понятного имени. Теперь я застрял на добавлении ключа к существующему PKCS # 12. Сборка STACK_OF(PKCS7) safes должна быть в порядке (так же, как сделано в p12_crt.c, я использую функцию PKCS12_add_key, которая выполняет криптографию), но я упускаю, как добавить это в существующий объект PKCS12. Функция PKCS12_pack_authsafes кажется не той, что мне нужна. Я думаю, что я добавил его в PKCS7 до ...? - person Yann Delanoe; 16.06.2017
comment
Возможно, мне нужно получить стек PKCS7 существующего PKCS12, добавить новый пакет для моего нового ключа и воссоздать новый PKCS12 с этим обновленным стеком? Я попробую это и отпишусь, если получится. - person Yann Delanoe; 16.06.2017

Наконец-то мне удалось добавить/разобрать несколько ключей RSA, и они удостоверяются в/из структуры/файла PKCS12. Моя функция синтаксического анализа основана на функции OpenSSL parse_pk12 в файле p12_kiss.c. Эта функция возвращает только последнюю сумку. Я адаптирую его, чтобы проверить понятное имя каждой сумки и вернуть тот, который соответствует.

Функция добавления начинается с распаковки сейфов (STACK_OF(PKCS7)) из существующего PKCS12, а затем работы с этим сейфом для добавления в него новой стопки сумок. Затем я создаю новый PKCS12 с функцией PKCS12_add_safes и удаляю предыдущий. Спасибо всем

person Yann Delanoe    schedule 19.06.2017
comment
Полный код @DanielSzy слишком длинный, чтобы его можно было добавить в комментарий. Итак, в основном: /* Get PKCS7 from PKCS12 */ safes = PKCS12_unpack_authsafes(*pkcs12)); bag = PKCS12_add_key(&bags, key, keytype, PKCS12_DEFAULT_ITER, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, pp); cp_safebag_attribute(bag, key, NID_ms_csp_name); cp_safebag_attribute(bag, key, NID_LocalKeySet); PKCS12_add_friendlyname(bag, keyAlias, -1); PKCS12_add_localkeyid(bag, keyid, keyidlen); PKCS12_add_safe(&safes, bags, -1, 0, NULL); newpkcs12 = PKCS12_add_safes(safes, 0); - person Yann Delanoe; 24.02.2020