Импорт SSL-сертификата в iPhone SDK

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

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

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

Любое обходное решение?


person Adam Ernst    schedule 17.11.2009    source источник


Ответы (4)


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

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

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

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.

person Adam Ernst    schedule 18.11.2009
comment
Странно - я могу отправить себе сертификат по электронной почте, и он правильно его анализирует, но если я попытаюсь загрузить его таким образом, я получу нуль для сертификата. - person Héctor Ramos; 01.04.2010
comment
Я изменил последнее утверждение на: assert(err == noErr || err == errSecDuplicateItem); для учета ошибки, если оно уже установлено. Для меня мне пришлось преобразовать сертификаты в формат DER, иначе этот код не работал бы. Я сделал это так: openssl x509 -in UTN-USERFirst-Hardware.cer -out UTN-USERFirst-Hardware.der -outform DER - person William Denniss; 16.01.2011

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

person Dave DeLong    schedule 17.11.2009
comment
Отличный ответ. Однако служба технической поддержки Apple ответила лучше — см. мой собственный ответ на этот вопрос. - person Adam Ernst; 19.11.2009

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

person Gabe    schedule 24.02.2012

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

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

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

person Chris Cleeland    schedule 17.11.2009
comment
Установка сертификатов вручную таким образом позволит пользователю просматривать этот веб-сайт в Mobile Safari без ошибок, но НЕ помогает для запросов, открытых в приложении (по крайней мере, в моем тестировании с iPod Touch Gen 2, iOS 3.0). - person William Denniss; 16.01.2011