Question

D'après ce que je vois dans la documentation de MPMoviewPlayerController, NSURLCredentialStorage peut être mis en place comme une alternative des défis d'authentification NSURLConnection (ce qui est utile pour les classes de niveau supérieur que les ressources de charge à partir d'URL, mais abstraire le NSURLConnection loin et ne fournissent pas un délégué pour relever des défis d'authentification). Cela semble similaire à l'installation d'un certificat dans le navigateur et l'avoir automatiquement sélectionner le certificat requis lorsqu'une certaine adresse exige.

Pour tester cela, je l'ai mis en place ma propre autorité de certification, le certificat de serveur et le certificat de client (un fichier p12). J'ai mis en place un serveur https et testé avec succès le certificat client à l'aide d'un navigateur, à partir d'une autre machine.

Maintenant, je dois avoir le certificat intégré dans mon application iPhone.

Je suis emmitouflé le fichier p12 et le lancement de l'application que je fais ceci:

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 fonction extractIdentityAndTrust est simplement copié forme le «certificat, les principales tâches et Trust Services pour iOS page de documentation (je viens de remplacer le mot de passe du certificat avec mon propre).

D'après ce que je peux dire l'identité et le certificat sont chargés bien. Si j'imprimer l'objet NSURLCredential dans la console que je reçois quelque chose comme ça. <NSURLCredential: 0x140ea0>: (null) (je ne peux pas dire si cela est un bon signe ou non)

Cependant, quand j'exécuter les setDefaultCredential application se bloque sans donner beaucoup d'informations.

Le STACKTRACE ressemble à quelque chose comme ceci:

#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 semble qu'il ya quelque chose pas configuré dans les informations d'identification.

Toutes les idées sur la façon de résoudre ce problème?

EDIT:

Juste pour tester j'ai installé le certificat sur l'iPhone en ouvrant le fichier à partir de Mail. Je peux accéder aux pages sur https via Safari, mais pas par mon application.

La seule chose qui fonctionne est si j'ouvre un NSURLConnection à une ressource sur le domaine protégé, répondre à didReceiveAuthenticationChallenge (où je charge mes lettres de créance exactement comme dans le code ci-dessus, que je l'envoie directement à l'expéditeur de NSURLAuthenticationChallenge) puis accéder à des choses que je vraiment besoin d'utiliser la classe de niveau supérieur.

Était-ce utile?

La solution

Il semble que c'est un problème connu que NSURLCredentialStorage ne fonctionne que pour NSURLCredentials nom d'utilisateur et mot de passe (certificats ne sont pas pris en charge). Malheureusement, la documentation mentionne rien à ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top