Используйте самозаверяющий ssl-сертификат в приложении для iphone

#ios #ssl #ssl-certificate #asihttprequest #nsurlrequest

#iOS #ssl #ssl-сертификат #asihttprequest #nsurlrequest

Вопрос:

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

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

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

Я установил этот сертификат на свой 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.

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

Ответ №1:

Хорошо, я разобрался. Я как бы залаял не по тому дереву.

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

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

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

Комментарии:

1. Ссылка разорвана, я думаю, это должна быть эта: developer.apple.com/library/content/documentation/Security /…