Подтвердить что ты не робот

Приложение IPhone с сертификатами клиента SSL

Я создаю приложение iphone, которому необходимо получить доступ к веб-службе через https с помощью клиентских сертификатов. Если я поставлю сертификат клиента (в формате pkcs12) в комплекте приложения, я могу загрузить его в приложение и сделать вызов https (в основном благодаря stackoverflow.com).

Однако мне нужен способ распространять приложение без каких-либо сертификатов и оставлять его пользователю для предоставления собственного сертификата. Я думал, что просто сделаю это, поручив пользователю импортировать сертификат в профилях iphone (settings- > general- > profiles), который вы получаете, открыв файл .p12 в Mail.app, а затем я бы получил доступ к этому элементу в моем приложении. Я ожидал бы, что сертификаты в профилях доступны через API-интерфейс keychain, но я думаю, что я ошибаюсь.

1) Есть ли способ получить доступ к сертификату, который я уже загрузил в профиль iphone в своем приложении?

2) Какие еще параметры у меня есть для загрузки указанного пользователем сертификата в моем приложении? Единственное, что я могу придумать, это предоставить некоторый интерфейс, где пользователь может указать URL-адрес своего .p12 cerificate, который затем я могу загрузить в брелок для приложения для последующего использования, но это не совсем пользовательский friednly. Я ищу что-то, что позволит пользователю поставить сертификат на телефон (отправьте его по электронной почте самому себе), а затем загрузите его в свое приложение.

4b9b3361

Ответ 1

Я пробовал с этим:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"]; 
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath]; 
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data; 
CFStringRef password = CFSTR("pass"); 
const void *keys[] = { kSecImportExportPassphrase }; 
const void *values[] = { password }; 
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); 
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
SecPKCS12Import(inPKCS12Data, optionsDictionary, &items); 

inPKCS12Data верна, но элементы пустые. Что происходит?

Ответ 2

Я сделал это для недавнего приложения, сделав папку документов для приложения доступной через itunes. Затем нашим пользователям предлагается перетащить сгенерированный ключ (в файл формата p12) в панель документов для нашего приложения в iTunes. Когда приложение запускается, оно проверяет наличие файла p12 и, если оно существует, импортирует файл в цепочку ключей.

Это не самая простая процедура, но она наиболее безопасна, потому что у вас нет файла закрытого ключа, отправляемого по электронной почте.

Ответ 3

Если файл .p12 не слишком велик, вы можете его закодировать с помощью Base64, а затем вставить ссылку в электронное письмо с пользовательским url, например:

myapp://certificate/<base 64 data>

Пользователь нажимает на ссылку, ваше приложение сохраняет сертификат где-то для будущего использования. Просто убедитесь, что Mail.app на iPhone не будет искажать электронную почту.

Ответ 4

Apple действительно ограничивает использование ключей/сертификатов на уровне устройства для своих собственных приложений/сервисов, таких как WiFi, VPN, Mail и т.д. Сторонние приложения не могут использовать ни один из этих ключей/сертификатов (без джейлбрейка). Тем не менее, приложения могут импортировать, хранить и использовать ключи и сертификаты в цепочке ключей в приложении. Кроме того, вы можете обмениваться ключами/сертификатами в нескольких приложениях с функцией keychain-access-group в iOS.

Недавно я опубликовал сообщение в блоге под названием "Мобильные сертификаты для приложений" , сделанные с помощью mCMS, которые, возможно, помогли вам. Наша компания разрабатывает API, который упрощает поддержку сертификатов в приложении, полученных непосредственно из PKI на базе Microsoft. Наше решение также предлагает генерацию ключей на устройстве вместо того, чтобы генерировать P12 на другом компьютере и пытаться импортировать его в ваше приложение.

Ответ 5

Если вы используете AirWatch для распространения приложений, их SDK предоставляет возможность предоставлять сертификаты из вашего центра сертификации зарегистрированным устройствам. Это позволяет вам предоставить свои сертификаты, а затем получить к ним доступ из вашего кода приложения.

Ответ 7

О, человек, это вызывает болезненные воспоминания с октября/ноября 2009 года. Я смог успешно получить сертификаты на стороне клиента для работы, но мне пришлось переносить libcurl на iPhone (что было нелегко, поскольку NDA все еще находилась в эффект в это время).

Я больше не занимаюсь разработкой приложений для iPhone за год, поэтому я не знаю, сколько было изменено, но если бы я был вами, я бы сначала попытался обойтись без сертификатов на стороне клиента, и если вы абсолютно должны иметь их вы можете использовать libcurl с сертификатами формата PEM.