#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 /…