Frage

Von dem, was ich sehe in der Dokumentation von MPMoviewPlayerController kann NSURLCredentialStorage als Alternative von NSURLConnection Authentifizierung Herausforderungen eingestellt wird (dies ist nützlich für die höheren Level-Klassen, dass Last-Ressourcen von URLs, sondern abstrakt den NSURLConnection weg und stellen keine Delegierten zur Handhabung von Authentifizierungs Herausforderungen). Dies scheint ähnlich ein Zertifikat im Browser zu installieren ist und es automatisch das gewünschte Zertifikat auswählen, wenn eine bestimmte Adresse verlangt.

Um dies zu testen, habe ich meine eigene Zertifizierungsstelle einrichten, Server-Zertifikat und Client-Zertifikat (eine P12-Datei). Ich habe einen https-Server eingerichtet und erfolgreich das Client-Zertifikat mit einem Browser, nicht von der Maschine getestet.

Jetzt muss ich das Zertifikat in meinem iPhone App integriert haben.

Ich habe die p12-Datei gebündelt und beim Programmstart ich dies tun:

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];

Die extractIdentityAndTrust Funktion wird einfach kopiert Form des ‚Zertifikat, Schlüssel, und Trust Services Aufgaben für iOS‘ Dokumentationsseite (I ersetzt nur das Zertifikat Passwort mit meinem eigenen).

Von dem, was ich die Identität sagen kann und das Zertifikat sind schön geladen. Wenn ich das NSURLCredential Objekt in der Konsole drucke ich so etwas wie diese:. <NSURLCredential: 0x140ea0>: (null) (ich kann nicht sagen, ob dies ein gutes Zeichen ist oder nicht)

Allerdings, wenn ich ausführen setDefaultCredential die App-Abstürze ohne viele Informationen.

Der Stacktrace sieht etwa so aus:

#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

scheint mir, wie es etwas nicht in dem Berechtigungsnachweis einrichten.

Alle Ideen, wie diese zu lösen?

EDIT:

Nur zum Testen installierte ich das Zertifikat auf dem iPhone durch die Datei von E-Mail zu öffnen. Ich kann auf die Seiten zugreifen über https durch Safari, aber nicht durch meine app.

Das einzige, was funktioniert ist, wenn ich einen NSURLConnection auf jede Ressource auf der geschützte Domäne öffnen, reagiert auf didReceiveAuthenticationChallenge (wo ich genau mein Credential laden wie in dem obigen Code, nur schicke es es direkt an NSURLAuthenticationChallenge des Absenders) und dann das Zeug zugreifen muß ich mit der höheren Level-Klasse wirklich.

War es hilfreich?

Lösung

Es scheint, es ist ein bekanntes Problem, dass NSURLCredentialStorage funktioniert nur für Benutzername und Passwort NSURLCredentials (Zertifikate werden nicht unterstützt). Leider dies die Dokumentation erwähnt nichts über.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top