Pregunta

Por lo que veo en la documentación de MPMoviewPlayerController, NSURLCredentialStorage se puede configurar como una alternativa de los desafíos de autenticación NSURLConnection (esto es útil para las clases de nivel superior que los recursos de carga de direcciones URL abstracta pero la NSURLConnection de distancia y no proporcionan un delegado para el manejo de los desafíos de autenticación). Esto parece similar a la instalación de un certificado en el navegador y hacer que la selección automática del certificado necesario cuando una determinada dirección exige.

Para probar esto he creado mi propia autoridad de certificación, el certificado de servidor y certificado de cliente (un archivo p.12). He creado un servidor HTTPS y probado con éxito el certificado de cliente utilizando un navegador, desde una máquina aparte.

Ahora tengo que tener el certificado integrado en mi aplicación para el iPhone.

Me he liado en el archivo p12 y el inicio de la aplicación hago esto:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"clientside" ofType:@"p12"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;    
SecIdentityRef identity;
SecTrustRef trust;
extractIdentityAndTrust(inPKCS12Data, &identity, &trust);

SecCertificateRef certificate = NULL;
SecIdentityCopyCertificate (identity, &certificate); 

const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                         initWithHost: @"myhostname"
                                         port: 443
                                         protocol: @"https"
                                         realm: nil
                                         authenticationMethod: NSURLAuthenticationMethodClientCertificate];

[[NSURLCredentialStorage sharedCredentialStorage]
 setDefaultCredential: credential
 forProtectionSpace: protectionSpace];

La función extractIdentityAndTrust es simplemente copió la forma 'Certificado, Llave, y Confianza Tareas de servicios para iOS La página de documentación (que acaba de reemplazar la contraseña del certificado con mi propia).

Por lo que puedo decir la identidad y el certificado se cargan muy bien. Si puedo imprimir el objeto NSURLCredential en la consola me sale algo como esto:. <NSURLCredential: 0x140ea0>: (null) (no puedo decir si esto es una señal buena o no)

Sin embargo, cuando ejecute setDefaultCredential la aplicación se bloquea sin dar mucha información.

La apariencia StackTrace algo como esto:

#0  0x350a41c8 in CFHash
#1  0x3515180c in __CFBasicHashStandardHashKey
#2  0x351534e4 in ___CFBasicHashFindBucket_Linear
#3  0x350a4000 in CFBasicHashFindBucket
#4  0x350a3ecc in CFDictionaryGetValue
#5  0x344a0df2 in URLCredentialStorage::setDefaultCredentialForProtectionSpace
#6  0x3446a5aa in CFURLCredentialStorageSetDefaultCredentialForProtectionSpace
#7  0x339ec79e in -[NSURLCredentialStorage setDefaultCredential:forProtectionSpace:]
#8  0x00002612 in -[AVPlayerExampleViewController awakeFromNib] at AVPlayerExampleViewController.m:84

Me parece que hay algo que se estableció en la credencial.

¿Alguna idea sobre cómo solucionar esto?

EDIT:

Sólo para probar que instalar el certificado en el iPhone abriendo el archivo de correo. Puedo tener acceso a las páginas a través de https a través de Safari, pero no a través de mi aplicación.

Lo único que funciona es si abro una NSURLConnection a cualquier recurso en el dominio protegido, responden a didReceiveAuthenticationChallenge (donde me carga mi credencial exactamente igual que en el código anterior, sólo que lo envía directamente al emisor de NSURLAuthenticationChallenge) y luego acceder a las cosas que realmente necesita el uso de la clase de nivel superior.

¿Fue útil?

Solución

Parece que es un problema conocido que NSURLCredentialStorage sólo funciona para usuario y contraseña NSURLCredentials (certificados no son compatibles). Por desgracia, la documentación no menciona nada acerca de esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top