KC_LoadKeyStore сбрасывает сертификаты CA, загруженные вручную

Добрый день!

Используем KC_LoadKeyStore() для загрузки нескольких хранилищ с разными alias’ами.
Корневой сертификат установлен системно, промежуточный загружаем вручную через X509LoadCertificateFromFile().

Вручную загружаем потому, что рассматриваем use case работы с коммерческими УЦ.
У каждого УЦ свой промежуточный сертификат. Конечно, в production целесообразней будет устанавливать их все в систему, но хочу воспроизвести и понять проблему.

Поправьте, если я ошибаюсь.

Столкнулись с тем, что при загрузке нового хранилища ранее загруженный промежуточный сертификат сбрасывается.

Воспроизведение:

// Корневой CA установлен системно через update-ca-certificates

// 1. Загружаем хранилище
KC_LoadKeyStore(..., "signer1");

// 2. Загружаем промежуточный сертификат
X509LoadCertificateFromFile(ca_intermediate, KC_CERT_INTERMEDIATE);

// 3. Подписываем — всё работает
SignData("signer1", flags, ...);  // OK

// 4. Загружаем второе хранилище
KC_LoadKeyStore(..., "signer2");

// 5. Пытаемся подписать первым — ошибка, промежуточный сброшен
SignData("signer1", flags, ...);  // KCR_CERTTIMEINVALID (0x08F00042)

Вопросы:

  1. Это ожидаемое поведение?
  2. Есть ли способ сохранить вручную загруженные сертификаты при добавлении новых хранилищ?

Текущее решение: просто перезагружаем промежуточные сертификаты после каждого KC_LoadKeyStore().

Это работает, но хотелось бы понять, есть ли более элегантный способ.

Здравствуйте!
Только установить в системное хранилище корневые сертификаты. Иначе не получится.
В момент вызова KC_LoadKeyStore() зачищаются корневые сертификаты. Такая логика работы библиотеки.

А почему так сделано, исторически или это диктуется чем-то? (секурность или еще что)