SecTrustCreateWithCertificates вылетает на iPad - PullRequest
5 голосов
/ 22 октября 2010

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

 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'

1 Ответ

4 голосов
/ 17 февраля 2011

В документации для 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) в соответствующей области.

...