ver perfiles instalar instalacion error confiar confiable certificados certificado aparecen iphone authentication ssl certificate

iphone - instalar - perfiles ios 11



iPhone: autenticación de certificado de cliente HTTPS (3)

Por supuesto, el problema fue con el simulador de iPhone en xcode :) Después de actualizar a la versión 3.1, comenzó a funcionar ...

Estoy luchando con una autenticación de certificado de cliente. Cuando un servidor necesita una credencial (un certificado en este caso), este método se invoca desde el delegado NSURLConnection :

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

Quiero cargar un certificado de un archivo, completar una credencial y ejecutar este método:

[[challenge sender] useCredential:[self credential] forAuthenticationChallenge:challenge];

Pero no sé cómo inicializar (o completar) un parámetro SecIdentityRef . Aquí está mi código que crea las credenciales:

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"]; NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath]; SecIdentityRef myIdentity; // ??? SecCertificateRef myCert = SecCertificateCreateWithData(NULL, (CFDataRef)certData); [certData release]; SecCertificateRef certArray[1] = { myCert }; CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); CFRelease(myCert); NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(NSArray *)myCerts persistence:NSURLCredentialPersistencePermanent]; CFRelease(myCerts);

¿Alguien sabe como resolverlo? Gracias.

Finalmente encontré la solución, pero hay un nuevo problema aquí:

mi cliente no envía el certificado al servidor Una vez que el servidor solicita el certificado, la aplicación ejecuta este método:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

y relleno la credencial (como mencioné anteriormente), pero la conexión finaliza con un error: NSURLErrorDomain -1206 . De acuerdo con los registros del servidor, la aplicación no envía el certificado del cliente.

¿Alguien tiene alguna experiencia con este comportamiento? ¿Necesito verificar de alguna manera el certificado en la aplicación? ¿O algo más para que funcione? Puedo proporcionar mi código actual si ayuda. Gracias por cualquier idea ...


También puede buscar la identidad en el llavero si almacena esta información allí:

+ (SecIdentityRef)dumpSecIdentityRef { OSStatus err; CFArrayRef result; CFIndex resultCount; CFIndex resultIndex; result = NULL; err = SecItemCopyMatching((__bridge CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)kSecClassIdentity, kSecClass, kSecMatchLimitAll, kSecMatchLimit, kCFBooleanTrue, kSecReturnRef, kCFBooleanTrue, kSecReturnAttributes, nil], (CFTypeRef *) &result); if ((result != NULL) && (err == noErr)) { NSMutableArray *identitiesArray = [NSMutableArray new]; resultCount = CFArrayGetCount(result); for (resultIndex = 0; resultIndex < resultCount; resultIndex++) { NSDictionary * thisResult; thisResult = (__bridge NSDictionary *) CFArrayGetValueAtIndex(result, resultIndex); NSLog(@"%@", (__bridge id)(result)); [identitiesArray addObject:thisResult]; } CFRelease(result); //TO DO - choose correct identity object from array. SecIdentityRef myIdentity = (__bridge SecIdentityRef)([[identitiesArray objectAtIndex:0] valueForKey:@"v_Ref"]); return myIdentity; } return nil; }


Yo uso estos pasos:

  1. extraiga SecIdentityRef del archivo de certificado pkcs12 utilizando la función SecPKCS12Import
  2. use la función SecIdentityCopyCertificate para obtener SecCertificateRef

y el resto (una inicialización de credencial) es el mismo que en mi pregunta ... Puedo poner aquí más código si lo desea. Tenga en cuenta que hay un error ( http://openradar.appspot.com/7090030 ) en el simulador de iphone, por lo que no es posible trabajar con muchos certificados en el simulador.