Используйте самозаверяющий 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, я смог передать его в запрос и получить все данные, прошедшие проверку подлинности.

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

Другие вопросы по тегам