Получить список сертификатов с устройства iOS

Я хочу получить список сертификатов, установленных на iPhone или iPad. Так что я могу использовать это, чтобы выбрать один и использовать для проверки ssl на сервере. Однако я не могу получить этот список. В этой следующей ссылке я увидел, что в iOS невозможно получить сертификаты, поскольку можно получить доступ только к своей собственной цепочке ключей. iOS получает установленные профили конфигурации

Однако я сомневаюсь :).

По приведенной ниже ссылке Получить сертификаты в цепочке ключей я использую код для получения сертификатов. Однако я получаю нулевые данные.

NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
                           (__bridge id)(kSecClassCertificate), kSecClass,
                           [NSNull null], kSecMatchSearchList,
                           kCFBooleanTrue, kSecReturnRef,
                           kSecMatchLimitAll, kSecMatchLimit,
                           nil];
    CFDataRef *items = nil;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, ((CFTypeRef *)&items));

Я даю [NSNull null] для списка поиска, предполагая, что если ссылка на цепочку для ключей равна NULL, то устройство принимает цепочку для ключей по умолчанию.

Мои вопросы: 1) Можно ли получить список установленных сертификатов с iPhone. 2) Если да то как? Что не так в приведенном выше коде?


person sridevi    schedule 08.02.2013    source источник
comment
Похоже, вы пытаетесь реализовать аутентификацию клиента ssl, где закрытый ключ находится в клиенте, и это сертификат, который вы ищете на клиенте. Это правильно?   -  person quellish    schedule 12.02.2013
comment
Нет. У меня нет закрытого ключа в клиенте. Клиенты будут иметь сертификаты, установленные на их устройствах. Мое приложение ничего не знает об этих сертификатах. Идея состоит в том, чтобы предоставить пользователю список всех доступных сертификатов, установленных на устройстве iOS. Дайте им выбор, чтобы выбрать один. И тогда приложение запомнит этот сертификат и будет использовать его позже. Но, как уже упоминалось, я не могу получить список всех сертификатов, установленных на устройстве.   -  person sridevi    schedule 13.02.2013
comment
Правильно. Итак, у вас есть учетные данные клиента, установленные через профиль конфигурации. В любом случае, для того, что вы хотите сделать, вы ищете удостоверение с цепочкой сертификатов, а не с сертификатом (т.е. ищете kSecClassIdentity). Он по-прежнему может быть недоступен для вашего приложения в зависимости от того, как был настроен профиль конфигурации.   -  person quellish    schedule 14.02.2013
comment
kSecClassIdentity также возвращает нулевые данные. Существуют ли какие-либо особые требования, которым должны соответствовать установленные сертификаты?   -  person sridevi    schedule 15.02.2013


Ответы (2)


Мои вопросы: 1) Можно ли получить список установленных сертификатов с iPhone.

Определенно.

2) Если да то как? Что не так в приведенном выше коде?

Насколько я понимаю, код в порядке (если нет, единственная проблема, о которой я могу думать, это установка этого NSNull - попробуйте опустить его). Чего вам не хватает, так это подписи вашего двоичного файла с соответствующими правами, а именно:

<key>keychain-access-groups</key>
<array>
    <string>*</string>
</array>

Вы можете найти пример списка свойств прав здесь - кстати , посмотрите весь этот проект, это интересно.

person Community    schedule 12.02.2013
comment
Спасибо за ответ. Пробовал менять права. Когда я установил * для ключа «keychain-access-groups», я получил следующую ошибку. «Исполняемый файл был подписан с недопустимыми правами. Права, указанные в файле прав подписи кода вашего приложения, не совпадают с правами, указанными в вашем профиле обеспечения». Я проверил свой профиль подготовки. Он имеет идентификатор приложения с подстановочным знаком. Если я установлю для «keychain-access-groups» значение $(AppIdentifierPrefix)*, тогда я получу ошибку OSStatus как «Операция не может быть завершена». Нужно ли что-то еще изменить в профиле обеспечения? - person sridevi; 13.02.2013
comment
В примере упоминается, что целевое устройство уже взломано. . Итак, назначение * для «групп доступа к цепочке ключей» — будет ли это работать на обычных устройствах, которые не взломаны? - person sridevi; 13.02.2013
comment
@PearlWhite Думаю, да, но почему бы тебе не попробовать? - person ; 13.02.2013
comment
Как уже упоминалось, я пробовал. Когда я установил * в «группы доступа к цепочке ключей», я получил следующую ошибку. «Исполняемый файл был подписан с недопустимыми правами. Права, указанные в файле прав подписи кода вашего приложения, не совпадают с правами, указанными в вашем профиле обеспечения». Я проверил свой профиль подготовки. Он имеет идентификатор приложения с подстановочным знаком. Итак, что еще нужно сделать, чтобы права подписи соответствовали профилю подготовки? - person sridevi; 13.02.2013
comment
@PearlWhite К сожалению, я не знаю. Я никогда не имел дело с настройками профилей. - person ; 13.02.2013

См. пример кода Apple для «GenericKeychain», доступный в документации «SecItemCopyMatching». Документация «Поиск сертификата в связке ключей» включает подробный код для поиска именованного сертификата, который вы получите на основе пары ключ/значение kSecAttrLabel.

person GoZoner    schedule 12.02.2013
comment
Я хочу получить все сертификаты, доступные на устройстве iOS. Пользователь выберет любой сертификат, который он хочет выбрать для установки соединения. Так что я не знаю имя сертификата вперед. - person sridevi; 13.02.2013
comment
Правильно, но код примера будет работать (и немного отличается от вашего кода), и поэтому он является хорошей отправной точкой. Добавьте дополнительные параметры в NSDictionary, чтобы получить полный список сертификатов. - person GoZoner; 17.02.2013