SecTrustCreateWithCertificates аварийно завершает работу на iPad

Я пытаюсь использовать инфраструктуру безопасности 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'

person lohithadas    schedule 22.10.2010    source источник
comment
Вы можете выложить сертификат?   -  person rook    schedule 22.10.2010


Ответы (1)


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

person Chris Zelenak    schedule 17.02.2011