2010-10-22 20 views
5

J'essaie d'utiliser le cadre de sécurité iOS pour communiquer en toute sécurité avec mon serveur. J'ai un fichier de certificat à partir duquel je peux obtenir une référence de clé publique. C'est ce que je fais.SecTrustCreateWithCertificates se bloque sur l'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); 

Ci-dessus le morceau de code fonctionne parfaitement sur iPhone et j'ai testé cela. Je suis capable de communiquer en toute sécurité avec mon serveur. Mais quand j'essaye de lancer mon application sur iPad (en mode 2x) le code ci-dessus se bloque. Après le débogage, j'ai découvert que secTrustCreateWithCertificate plante et le log de crash est donné ci-dessous .. Le certificat que j'ai utilisé est identique pour iPad et iPhone ... La fonction ci-dessus secCertificateCreateWithData retourne une référence de certificat et n'est pas nulle ... pas la cause de l'accident .. Qu'est-ce que je fais mal.

*** -[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

Pouvez-vous poster le certificat? – rook

Répondre

4

La documentation pour SecTrustCreateWithCertificates réclamations que vous pouvez passer soit un certificat ou un tableau. L'exception que vous recevez indique que -[NSCFType count]: unrecognized selector sent to instance. Qu'est-ce qui se passe dans iOS 3.2 est que SecTrustCreateWithCertificates traite la valeur d'entrée comme un CFArray sans vérifier d'abord si c'est un singulier SecCertificateRef.

Pour contourner ce problème, vous pouvez faire quelque chose de similaire au code suivant:

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

se rappeler juste CFRelease(array) à la portée appropriée.