Приложение для iPhone с сертификатами SSL-клиента - PullRequest
20 голосов
/ 10 января 2010

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

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

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

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

Ответы [ 7 ]

3 голосов
/ 27 января 2010

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

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); 

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

2 голосов
/ 25 апреля 2011

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

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

1 голос
/ 04 декабря 2015

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

1 голос
/ 27 июля 2012

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

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

1 голос
/ 10 января 2010

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

.
myapp://certificate/<base 64 data>

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

0 голосов
/ 02 апреля 2010

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

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

0 голосов
/ 10 января 2010

Работает ли для вас код, предложенный в Поиск сертификата в связке ключей ?

...