Импорт сертификата SSL под iPhone SDK - PullRequest
9 голосов
/ 17 ноября 2009

Мое приложение подключается к серверу Schwab OFX с использованием NSURLConnection. К сожалению, сервер использует самый последний промежуточный сертификат, которому доверяют на рабочем столе Mac, но еще не iPhone. (Попробуйте URL-адрес - вы получите ошибку на iPhone.)

Нет простого способа заставить NSURLConnection игнорировать недействительный сертификат, о котором я знаю. Таким образом, я пытаюсь импортировать сертификат в связку ключей вручную и установить его уровень доверия, но я попал в блок.

Я успешно звоню SecCertificateCreateWithData, чтобы импортировать сертификат из файла .cer. На рабочем столе я бы назвал SecTrustSettingsSetTrustSettings, но его нет в iPhone SDK.

Есть ли обходной путь?

Ответы [ 4 ]

12 голосов
/ 19 ноября 2009

Техническая поддержка Apple незамедлительно ответила мне идеальным ответом.

Во-первых, я не прав, когда говорю, что Шваб использует «самый последний промежуточный сертификат, которому доверяют на рабочем столе Mac, но еще не iPhone». Промежуточные сертификаты никогда не находятся во встроенном хранилище корневых сертификатов. Проблема в том, что большинство SSL-серверов связывают все промежуточные сертификаты, необходимые для проверки, но Schwab использует альтернативный процесс SSL, который ожидает, что вы получите промежуточный сертификат из URL-адреса. Рабочий стол Mac поддерживает выборку промежуточных сертификатов, но не текущую версию iPhone OS.

Вот суть фактического кода:

OSStatus            err;
NSString *          path;
NSData *            data;
SecCertificateRef   cert;

path = [[NSBundle mainBundle] pathForResource:@"OFX-G3" ofType:@"cer"];
assert(path != nil);

data = [NSData dataWithContentsOfFile:path];
assert(data != nil);

cert = SecCertificateCreateWithData(NULL, (CFDataRef) data);
assert(cert != NULL);

err = SecItemAdd(
    (CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys:
        (id) kSecClassCertificate,  kSecClass, 
        cert,                       kSecValueRef, 
        nil
    ], 
    NULL
);
assert(err == noErr);

CFRelease(cert);

Предполагается, что OFX-G3.cer является промежуточным сертификатом SSL и находится в папке Resources.

2 голосов
/ 17 ноября 2009

Вы можете обойти настройки ssl, используя объект CFStream CoreFoundation. Вам нужно будет сделать что-то вроде создания потока, который подключается к соответствующему порту на сервере OFX, а затем использовать CF(Read|Write)StreamSetProperty для предоставления CFDictionary (к которому вы можете привести NSDictionary) с ключами, такими как kCFStreamSSLLevel , kCFStreamSSLAllowsAnyRoot, kCFStreamSSLValidatesCertificateChain и т. Д.

1 голос
/ 25 февраля 2012

Вы можете установить сертификат непосредственно в файле TrustStore.sqlite3 симулятора. Charles Proxy использует это для установки своего корневого сертификата в симуляторе. http://www.charlesproxy.com/documentation/faqs/ssl-connections-from-within-iphone-applications/

0 голосов
/ 17 ноября 2009

Вы пытаетесь сделать это программно или это нормально делать через обычный пользовательский интерфейс?

Утилита настройки iPhone от Apple позволяет добавлять сертификаты на телефон. Вы также можете просто отправить сертификат по электронной почте пользователю, который может прочитать электронную почту на телефоне, а затем открыть сертификат на телефоне, и он спросит вас, хотите ли вы установить сертификат.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...