2010-10-22 4 views
5

Я пытаюсь использовать инфраструктуру безопасности iOS для надежной связи с моим сервером. У меня есть файл сертификата, из которого я могу получить ссылку на открытый ключ. Это то, что я делаю.SecTrustCreateWithCertificates падает на iPad

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"supportwarriors.com" ofType:@"cer"]; 
SecCertificateRef myCertificate = nil; 

NSData *certificateData = [[NSData alloc] initWithContentsOfFile:certPath]; 
myCertificate  = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData); 

//got certificate ref..Now get public key secKeyRef reference from certificate.. 
SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); 
SecTrustRef myTrust; 
OSStatus status  = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust); 

    SecTrustResultType trustResult; 
    if (status == noErr) { 
     status = SecTrustEvaluate(myTrust, &trustResult); 
    } 
publicKey  = SecTrustCopyPublicKey(myTrust); 

Над куском кода отлично работает на iPhone, и я проверил это. Я могу безопасно общаться с моим сервером. Но когда я пытаюсь запустить приложение на iPad (в режиме 2x), приведенный выше код становится разбитым. После отладки я обнаружил, что secTrustCreateWithCertificate сбой, и журнал сбоев приведен ниже. Сертификат, который я использовал, одинаково для iPad и iPhone ... Функция выше secCertificateCreateWithData возвращает ссылку на сертификат и не равна нулю ... Так что это не причина аварии. Что я делаю неправильно.

*** -[NSCFType count]: unrecognized selector sent to instance 0x14af24 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***  -[NSCFType count]: unrecognized selector sent to instance 0x14af24' 
+0

Можете ли вы разместить сертификат? – rook

ответ

4

Документация SecTrustCreateWithCertificates утверждает, что вы можете передавать или один сертификат или массив. Исключением, которое вы принимаете, является то, что -[NSCFType count]: unrecognized selector sent to instance. Что происходит в iOS 3.2, так это то, что SecTrustCreateWithCertificates обрабатывает входное значение как CFArray, не проверяя сначала, является ли оно особым SecCertificateRef.

Чтобы обойти эту проблему, вы можете сделать что-то подобное следующему коду:

SecCertificateRef certs[1] = { certificate }; 
    CFArrayRef array = CFArrayCreate(NULL, (const void **) certs, 1, NULL); 
    if(SecTrustCreateWithCertificates(array, x509Policy, &trustChain) == errSecSuccess) 

только не забудьте CFRelease(array) в соответствующем объеме.

Смежные вопросы