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