Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Дв.  
#1 Оставлено : 14 октября 2021 г. 12:19:12(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Ранее реализовали импорт контейнера сертификата .pfx по примерам в android, теперь перешли к реализации импорта в ios, но столкнулись с проблемой,
непонятно как это реализуется тут, примеров не нашли. Получилось считать контейнер следующим образом:

RCT_EXPORT_METHOD(importPFXContainer: (NSString *) path
pasword: (NSString *) password
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) {
CRYPT_DATA_BLOB blob = readPFXContainer(path);
LPCWSTR pass = convertNSString(password);

HCERTSTORE pfxStore = PFXImportCertStore(&blob, pass, PKCS12_IMPORT_SILENT);
if (!pfxStore) {
reject(@"Error code", @"Error message", nil);
return;
}

PCCERT_CONTEXT pCertContext = 0;
// PCCERT_CHAIN_CONTEXT pChainContext;

while(0 != (pCertContext = CertEnumCertificatesInStore(pfxStore, pCertContext))) {
// CertFindChainInStore
// HCERTSTORE hdStore = CertOpenSystemStoreA(0, "HDIMAGE");
}


resolve(@TRUE);
}

CRYPT_DATA_BLOB readPFXContainer(NSString *filePath) {
NSData *fileData = [NSData dataWithContentsOfFile:filePath];

CRYPT_DATA_BLOB blob;
blob.cbData = (DWORD)[fileData length];
blob.pbData = (BYTE*)malloc (blob.cbData);
[fileData getBytes:blob.pbData length:blob.cbData];

return blob;
}

LPCWSTR convertNSString(NSString *text) {
return (LPCWSTR)[text cStringUsingEncoding:NSUTF16LittleEndianStringEncoding];
}

Можно получить пример как дальше сохранить сертификат с ключом в системный контейнер?
Нужно ли при этом так же сохранять цепочку сертификатов как в версии android?

Отредактировано пользователем 14 октября 2021 г. 12:19:45(UTC)  | Причина: Не указана

Offline Андрей Русев  
#2 Оставлено : 14 октября 2021 г. 14:06:35(UTC)
Русев Андрей

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,260

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 442 раз в 322 постах
При импорте без флага PKCS12_NO_PERSIST_KEY контейнеры с ключами создаются в момент импорта, остаётся только переложить из полученного хранилища сертификаты в личное хранилище. Отмечу, что
* в pfx-е может быть несколько закрытых ключей с сертификатами
* могут быть другие сертификаты, например, промежуточных УЦ - их целесообразно класть в хранилище CA
* могут быть сертификаты корневых УЦ - их целесообразно класть в хранилище ROOT, но при этом надо понимать, что это потенциально опасное действие, так как оно касается краеугольного камня PKI - корней доверия
Официальная техподдержка. Официальная база знаний.
Offline Дмитрий Дв.  
#3 Оставлено : 14 октября 2021 г. 14:19:04(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Автор: Андрей Русев Перейти к цитате
При импорте без флага PKCS12_NO_PERSIST_KEY контейнеры с ключами создаются в момент импорта, остаётся только переложить из полученного хранилища сертификаты в личное хранилище. Отмечу, что
* в pfx-е может быть несколько закрытых ключей с сертификатами
* могут быть другие сертификаты, например, промежуточных УЦ - их целесообразно класть в хранилище CA
* могут быть сертификаты корневых УЦ - их целесообразно класть в хранилище ROOT, но при этом надо понимать, что это потенциально опасное действие, так как оно касается краеугольного камня PKI - корней доверия


Получается, в данном случае задача сводится к копированию данных из полученного хранилища в личное, с учётом того, что кроме сертификатов с ключами в полученном хранилище могут содержаться цепочки сертификатов, которые нужно проигнорировать? Или достаточно пробежаться по всем pCertContext из CertEnumCertificatesInStore и для каждого выполнить CertAddCertificateContextToStore?

Отредактировано пользователем 14 октября 2021 г. 15:07:27(UTC)  | Причина: Не указана

Offline Андрей Русев  
#4 Оставлено : 14 октября 2021 г. 17:49:53(UTC)
Русев Андрей

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,260

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 442 раз в 322 постах
Оба ваших утверждения верны, но при топорном проходе по pCertContext-ам вы можете положить в личное чуток лишнего (например, руты).
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Русев Андрей за этот пост.
Дмитрий Дв. оставлено 15.10.2021(UTC)
Offline Дмитрий Дв.  
#5 Оставлено : 18 октября 2021 г. 17:19:18(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Понятно, а как тогда можно отфильтровать не пользовательские сертификаты, т.е. сертификаты без ключей? Без примеров по одним методам из .h файлов не совсем понятно как определить у каких сертификатов есть ключ.. И сразу появляется ещё один вопрос, как потом удалить сертификат с контейнером? В android можно удалять сертификаты по alias, в ios такого нет, и если мы хотим удалять так же по идентификатору, то нужно его как то самостоятельно высчитывать, и потом бежать по всем сертификатам в хранилище, сравнивая рассчитанный ранее идентификатор и в случае совпадения удалять через метод CertDeleteCertificateFromStore? И контейнер с ключом тоже удалится или нужно отдельно его удалить через CryptIcquireContextA с флагом CRYPT_DELETEKEYSET?
Offline Андрей Русев  
#6 Оставлено : 21 октября 2021 г. 22:35:39(UTC)
Русев Андрей

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,260

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 442 раз в 322 постах
Сертификат с закрытым ключом можно отличить по наличию свойства CertGetCertificateContextProperty(CERT_KEY_PROV_INFO_PROP_ID) - это так называемая ссылка на закрытый ключ.

Если контейнер у вас всегда появляется в паре с сертификатом, который на него ссылается (ссылка на закрытый ключ), то можно делать CryptAcquireCertificatePrivateKey(pCert) + CryptSetProvParam(PP_DELETE_KEYSET) + CertDeleteCertificateFromStore(pCert).
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Русев Андрей за этот пост.
Дмитрий Дв. оставлено 22.10.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.