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

Использовать самоподписанный сертификат ssl в приложении iphone

Я заранее извиняюсь за длинный вопрос. У меня возникают проблемы с самоподписанным сертификатом SSL, и я хочу документировать все, что я пробовал до сих пор.

Я работаю над приложением, которое общается с службой REST. На тестовом сервере используется самоподписанный сертификат ssl, который я могу установить на свой компьютер без проблем. Это файл .p12, для которого требуется установить пароль. Без этого сертификата все запросы на сервер возвращают 403.

.p12 устанавливает три элемента в цепочке ключей: "Корневой центр сертификации", сертификат "тестового пользователя", выданный "Корневым центром сертификации", и закрытый ключ, связанный с сертификатом "test user".

Я установил этот сертификат на своем iPad, отправив мне сам файл .p12. Я нажал на вложение, введите пароль, и теперь я могу получить доступ к сайту в Safari. К сожалению, из-за применения песочницы это недостаточно, чтобы заставить мое приложение общаться с сервисом REST.

Я использую ASIHTTPRequest для всей связи с службой REST из моего приложения. Каждый запрос является подклассом ASIHTTPRequest. Первое, что я нашел, мне нужно было сделать, это позвонить [self setValidatesSecureCertificate:NO];, чтобы он даже попытался подключиться к серверу SSL. Если это все, что я делаю, я получаю 403 кода ошибок из службы.

Теперь я не могу понять, как получить запрос на использование сертификата. Я попытался экспортировать три элемента в отдельный файл .cer, включая их в проект, и добавить их в запрос, используя следующий код:

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];

Пока этот код выполняется без проблем с использованием этого подхода, я все равно получаю ошибку 403.

Я даже попытался включить файл .p12 в свое приложение и импортировал его с помощью того же кода. Это терпит неудачу, потому что SecCertificateCreateWithData возвращает nil.

Я признаю, что не знаю, что я здесь делаю. Это все немного над моей головой, и любая помощь, которую кто-либо может мне дать, будет очень признательна.

4b9b3361

Ответ 1

ОК, я понял это. Я как бы лаял неправильное дерево.

Самая важная информация, которую я нашел, была в документации Apple для Руководство по программированию сертификатов, ключей и доверительных служб, в частности, "Задачи для iOS". Это подробно описано, как извлечь идентификатор безопасности из файла .p12 и как добавить исключение доверия.

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

Я надеюсь, что это поможет кому-то еще, кто должен реализовать подобную функцию.