2013-02-08 2 views
7

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

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

Из нижеуказанной ссылки Get Certificates in Keychain Я использую код для получения сертификатов. Однако я получаю нулевые данные.

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, то устройство принимает брелка по умолчанию.

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

+0

Похоже, вы пытаетесь внедрить аутентификацию клиента ssl, где закрытый клиент находится на клиенте, и это сертификат, который вы ищете на клиенте. Это верно? – quellish

+0

Нет. У меня нет закрытого ключа в клиенте. Клиент будет иметь сертификаты, установленные на их устройствах. Мое приложение ничего не знает об этих сертификатах. Идея - представить список всех доступных сертификатов, установленных на устройстве iOS, пользователю. Дайте им выбор, чтобы выбрать один. И тогда приложение будет помнить этот сертификат и использовать его позже. Но, как уже упоминалось, я не могу получить список всех сертификатов, установленных на устройстве. – sridevi

+0

Справа. Таким образом, у вас есть учетные данные клиента, установленные через профиль конфигурации. В любом случае, за то, что вы хотите сделать, вы ищете идентификатор с цепочкой сертификатов, а не сертификат (т. Е. Поиск kSecClassIdentity). Это может быть недоступно для вашего приложения в зависимости от того, как был настроен профиль конфигурации. – quellish

ответ

5

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

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

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

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

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

Вы можете найти пример выплачиваемого списка свойств here - кстати, проверить весь этот проект, это интересно.

+0

Спасибо за ответ. Я попытался изменить права. Когда я устанавливал * для ключа keychain-access-groups, я получил следующую ошибку.«Исполняемый файл был подписан с недействительными правами. Права, указанные в файле подписи кода подписи приложения, не соответствуют указанным в профиле обеспечения. ' Я проверил профиль подготовки. Он имеет подстановочный знак. Если я установил 'keychain-access-groups' в $ (AppIdentifierPrefix) *, то я получаю ошибку OSStatus как «Операция не может быть выполнена». Необходимо ли что-либо еще изменить в профиле подготовки? – sridevi

+0

[Пример] (https://github.com/ptoomey3/Keychain-Dumper/blob/master/README.md) упоминает, что предполагается, что целевое устройство уже было взломанным Поэтому, назначая * группам «keychain-access-groups», будет ли она работать на обычных устройствах, которые не были взломаны? – sridevi

+0

@PearlWhite Я так полагаю, но почему бы вам не попробовать? – 2013-02-13 17:26:05

2

См. Примерный код Apple для «GenericKeychain» - доступный из документации «SecItemCopyMatching». В документе «Поиск сертификата в Keychain» содержится подробный код для finda named certificate - который вы получите на основе пары ключ/значение kSecAttrLabel.

+0

Я хочу чтобы получить все сертификаты, доступные на устройстве iOS. Пользователь выберет любой сертификат, который они хотят выбрать для установления соединения. Поэтому я не знаю названия сертификата раньше. – sridevi

+0

Правильно, но пример кода будет работать (и немного отличный от вашего кода) и, следовательно, является хорошей отправной точкой. Добавьте дополнительные опции в NSDictionary, чтобы получить полный список сертификатов. – GoZoner

Смежные вопросы