2010-10-22 21 views
5

Estoy intentando usar el marco de seguridad de iOS para comunicarme de forma segura con mi servidor. Tengo un archivo de certificado desde el que puedo obtener una referencia de clave pública. Esto es lo que estoy haciendo.SecTrustCreateWithCertificates se bloquea en el 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); 

El código anterior funciona perfectamente en iPhone y lo he probado. Puedo comunicarme de forma segura con mi servidor. Pero cuando intento ejecutar mi aplicación en el iPad (en modo 2x), el código anterior se cuelga. Después de la depuración, descubrí que secTrustCreateWithCertificate se está bloqueando y el registro de fallos se muestra a continuación. El certificado que utilicé es el mismo para iPad y iPhone ... La función anterior secCertificateCreateWithData devuelve una referencia de certificado y no es nula ... Así que eso es no la causa del accidente ... ¿Qué estoy haciendo 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

¿Se puede publicar el certificado? – rook

Respuesta

4

La documentación para SecTrustCreateWithCertificates reclamaciones que se puede pasar ya sea un solo certificado o una matriz. La excepción que recibe indica que -[NSCFType count]: unrecognized selector sent to instance. Lo que está sucediendo en iOS 3.2 es que SecTrustCreateWithCertificates está tratando el valor de entrada como un CFArray sin verificar primero para ver si es un singular SecCertificateRef.

Para evitar esto, se puede hacer algo similar al código siguiente:

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

sólo recuerda a CFRelease(array) en el ámbito de aplicación adecuado.

Cuestiones relacionadas