Используйте самозаверяющий ssl-сертификат в приложении для iphone
Заранее прошу прощения за многословный вопрос. У меня проблемы с самозаверяющим сертификатом 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
возвращает ноль
Признаюсь, я действительно не знаю, что я здесь делаю. Это все немного над моей головой, и любая помощь, которую кто-либо может оказать мне, будет принята с благодарностью.
1 ответ
Хорошо, я понял это. Я как бы лаял не то дерево.
Самая важная информация, которую я нашел, была в документации Apple для Руководства по программированию сертификатов, ключей и доверенных служб, в частности, на странице "Задачи для iOS". Здесь подробно описано, как извлечь идентификатор безопасности из файла.p12 и как добавить исключение доверия.
Последний фрагмент головоломки был в документации ASIHTTPRequest о поддержке сертификатов клиентов. Используя идентификатор, который я извлек непосредственно из файла p12, я смог передать его в запрос и получить все данные, прошедшие проверку подлинности.
Я надеюсь, что это поможет любому, кто должен реализовать подобную функцию.