2016-09-16 1 views
0

Начнем с некоторых справочной информацией о нашем приложении:Доступа установленных профилей/сертификаты из приложения

Наших IOS приложение подключается к вебу-сервисам, которые в большинстве случаев требуют (за исключением несколько белых списка IP-адресов) аутентификаций , Поскольку эта система должна быть невероятно безопасной, компания решила использовать клиентские сертификаты для доступа к серверу. Каждый пользователь получит сертификат, созданный на основе того, будут ли они использовать приложение или веб-интерфейс, который им придется загружать и устанавливать самостоятельно.

Система, которая была на месте в приложении, была такой; пользователь попытается подключиться к веб-службам. Исходный базовый «внутренний» URL-адрес будет терпеть неудачу, поскольку у них нет доступа к нему, поэтому базовый URL-адрес изменится на URL-адрес, требующий сертификата. Когда у пользователя нет установленного сертификата, существует процесс, который позволит пользователю загрузить его сертификат на основе полученного QR-кода. Затем сертификат будет установлен в приложении, и пользователь может свободно обращаться к веб-службам и использовать приложение.

Эта система работает, но для этого требуется много действий.

Сейчас в настоящее время:

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

И вот в чем проблема, я не могу получить доступ к установленному сертификату из приложения и продолжать получать ошибки 401.

Я сделал несколько исследований, чтобы начать его, и мой первоначальный ответ был «Эта работа не будет», как сказано на этой странице официальной странице разработчика:

In iOS, an app can access only its own items in the keychain—the user is never asked for permission or for a password.

Но потому что мы хотим быть уверены на 100%, я продолжал смотреть на некоторое время и в конце концов столкнулся с примерами кода, как:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 
{ 
    SecTrustRef trust = challenge.protectionSpace.serverTrust; 
    NSURLCredential *credential = [NSURLCredential credentialForTrust:trust]; 
    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; 
} 

Но это не похоже, чтобы получить какой-либо установленный сертификат или что-нибудь.

следующие булевы также установлены:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; 
{ 
    return YES; 
} 

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection; 
{ 
    return YES; 
} 

Чтобы сделать некоторые дальнейшей проверки за пределами самого приложения, я смотрел на IPad мы имеем здесь. У него есть сертификат, установленный для веб-сайта (разные права, чем тот, который используется для приложения), а в Safari я могу получить доступ к веб-сайту, защищенному сертификатом. Однако в Chrome и Firefox я ошибаюсь, что для веб-сайта требуется сертификат. Таким образом, это заставляет меня думать, что действительно невозможно получить доступ к этим сертификатам, если вы в основном не являетесь приложением Apple.

Так что, в основном, я в конце концов с этим вопросом. Краткая версия этого вопроса: Могу ли я получить доступ к установленному клиентскому сертификату на iPhone из своего приложения, чтобы получить доступ к веб-службам, требующим этого сертификата?

И если да, то длинная версия: Как?

+0

Что вы имеете в виду, когда говорите установленный сертификат? Как выглядит ваш профиль MDM? – dgatwood

+0

Ничего. Я уверен, что сертификаты клиентов работают только в Mobile Safari. – dgatwood

ответ

0

Если бы я был вами, я бы использовал Managed App Configuration, чтобы вставить набор пользовательских префов в приложение и использовать его для предоставления URL-адреса, где можно загрузить сертификат клиента. Удалите его на сервере после первого запроса.

+0

Загрузка уже выполняется, по крайней мере, пока. Это немного похоже на то, что вы предложили, за исключением того, что пользователь будет использовать QR-код для перенаправления на сервер. Впоследствии сертификат будет заархивирован. В основном это делается так, потому что экземпляры, передающие QR-код, хотят иметь контроль над этим. Это действительно все еще вариант и потребует меньше самих пользователей, но это все равно означает, что вы полагаетесь на сертификат в приложении. Но похоже, что это ограничение, с которым пользователи/компании должны будут жить. – Kevin

+0

Да. К сожалению, добавление глобальных разделяемых элементов keychain не было прецедентом, который Apple предвидела, когда они переработали брелок для iOS. Если Apple явно не добавляет механизм добавления элементов в цепочку ключей конкретного приложения через профили конфигурации или через MDM, вы в значительной степени застреваете. Я бы предложил подать запрос на повышение радара, запрашивающий такую ​​функцию. – dgatwood

+0

Хорошо, спасибо за это понимание. Я отвечу на этот вопрос как на принятый ответ, так как он в основном отвечает на вопрос, подходит ли кейс для iOS для приложений и дает альтернативный способ загрузки сертификата :) – Kevin

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