Domanda

Da quello che vedo nella documentazione di MPMoviewPlayerController, NSURLCredentialStorage può essere impostato come alternativa di sfide di autenticazione NSURLConnection (questo è utile per le classi di livello superiore che le risorse di carico da URL, ma astratto della NSURLConnection di distanza e non forniscono un delegato per la gestione delle sfide di autenticazione). Questo sembra simile a installare un certificato nel browser e averlo automaticamente selezionare il certificato richiesto quando un certo indirizzo lo richiede.

Per testare questo fuori ho impostato la mia autorità di certificazione, certificato server e certificato client (un file .p12). Ho creato un server HTTPS e testato con successo il certificato client utilizzando un browser, da una macchina separata.

Ora ho bisogno di avere il certificato integrato nel mio iPhone app.

Ho fornito in bundle il file p12 e il lancio di applicazioni faccio questo:

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 funzione extractIdentityAndTrust si forma semplicemente copiato il 'certificato, le attività principali, e amministrazione fiduciaria per iOS' pagina di documentazione (Ho appena sostituito la password del certificato con i miei).

Da quello che posso dire l'identità e il certificato vengono caricati bene. Se si stampa l'oggetto NSURLCredential nella console ottengo qualcosa di simile:. <NSURLCredential: 0x140ea0>: (null) (non posso dire se questo è un buon segno o no)

Tuttavia quando ho eseguire setDefaultCredential l'applicazione si blocca senza dare molte informazioni.

L'aspetto StackTrace qualcosa di simile:

#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

mi sembra c'è qualcosa che non impostato nella credenziale.

Tutte le idee su come risolvere questo?

EDIT:

Proprio per testare Ho installato il certificato sul iPhone aprendo il file da Mail. Posso accedere alle pagine oltre https tramite Safari, ma non attraverso la mia app.

L'unica cosa che funziona è se apro un NSURLConnection a qualsiasi risorsa sul dominio protetto, rispondere a didReceiveAuthenticationChallenge (dove io carico la mia credenziale esattamente come nel codice di cui sopra, solo che inviarlo direttamente al mittente di NSURLAuthenticationChallenge) e poi accedere le cose che ho davvero bisogno di utilizzare la classe di livello superiore.

È stato utile?

Soluzione

Sembra che sia un problema noto che NSURLCredentialStorage funziona solo per nome utente e password NSURLCredentials (certificati non sono supportati). Purtroppo la documentazione menziona nulla di questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top