Приложение IPhone с сертификатами клиента SSL
Я создаю приложение iphone, которому необходимо получить доступ к веб-службе через https с помощью клиентских сертификатов. Если я поставлю сертификат клиента (в формате pkcs12) в комплекте приложения, я могу загрузить его в приложение и сделать вызов https (в основном благодаря stackoverflow.com).
Однако мне нужен способ распространять приложение без каких-либо сертификатов и оставлять его пользователю для предоставления собственного сертификата. Я думал, что просто сделаю это, поручив пользователю импортировать сертификат в профилях iphone (settings- > general- > profiles), который вы получаете, открыв файл .p12 в Mail.app, а затем я бы получил доступ к этому элементу в моем приложении. Я ожидал бы, что сертификаты в профилях доступны через API-интерфейс keychain, но я думаю, что я ошибаюсь.
1) Есть ли способ получить доступ к сертификату, который я уже загрузил в профиль iphone в своем приложении?
2) Какие еще параметры у меня есть для загрузки указанного пользователем сертификата в моем приложении? Единственное, что я могу придумать, это предоставить некоторый интерфейс, где пользователь может указать URL-адрес своего .p12 cerificate, который затем я могу загрузить в брелок для приложения для последующего использования, но это не совсем пользовательский friednly. Я ищу что-то, что позволит пользователю поставить сертификат на телефон (отправьте его по электронной почте самому себе), а затем загрузите его в свое приложение.
Ответы
Ответ 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 предоставляет возможность предоставлять сертификаты из вашего центра сертификации зарегистрированным устройствам. Это позволяет вам предоставить свои сертификаты, а затем получить к ним доступ из вашего кода приложения.
Ответ 6
Используется ли код, предложенный в Поиск сертификата в цепочке ключей?
Ответ 7
О, человек, это вызывает болезненные воспоминания с октября/ноября 2009 года. Я смог успешно получить сертификаты на стороне клиента для работы, но мне пришлось переносить libcurl на iPhone (что было нелегко, поскольку NDA все еще находилась в эффект в это время).
Я больше не занимаюсь разработкой приложений для iPhone за год, поэтому я не знаю, сколько было изменено, но если бы я был вами, я бы сначала попытался обойтись без сертификатов на стороне клиента, и если вы абсолютно должны иметь их вы можете использовать libcurl с сертификатами формата PEM.