2013-10-29 12 views
5

Ich versuche, NSURLCredential mit der +credentialWithIdentity:certificates:persistence: Methode zu erstellen. Es kehrt jedoch nicht zurück.NSURLCredential creation returning null

Ich habe die folgenden Schritte ausgeführt. Zuerst erstelle ich einen privaten und öffentlichen Schlüssel, dann ein Zertifikat und füge es meinem Schlüsselbund hinzu. Das erste Problem, wenn ich dies tun:

static const uint8_t certificateIdentifier[] = "test.certificate";  
NSData * certificateTag = [NSData dataWithBytes:certificateIdentifier length:sizeof(certificateIdentifier)]; 
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certificadoData); 
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 
[dictionary setObject:(__bridge id)kSecClassCertificate forKey:(__bridge id)kSecClass]; 
[dictionary setObject:certificateTag forKey:(__bridge id)kSecAttrApplicationTag]; 
[dictionary setObject:(__bridge id)(cert) forKey:(__bridge id<NSCopying>)(kSecValueRef)]; 
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL); 

Der Status sagt mir, dass meine certificateTag ein ungültiges Argument ist. Wenn ich diesen Tag nicht und ich das Zertifikat auf meinem Schlüsselbund setzen kann, dann innerhalb der Methode

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

I

SecIdentityRef myIdentity; 
SecCertificateRef myCertificate; 

NSMutableDictionary * queryCertificate = [[NSMutableDictionary alloc] init]; 
[queryCertificate setObject:(__bridge id)kSecClassIdentity forKey:(__bridge id)kSecClass]; 
[queryCertificate setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef]; 

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)queryCertificate, (CFTypeRef *)&myIdentity); 

status = SecIdentityCopyCertificate(myIdentity, &myCertificate); 

const void *certs[] = { myCertificate }; 
CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL); 
NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(__bridge NSArray*)certsArray persistence:NSURLCredentialPersistencePermanent]; 

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

ich die Identität und das Zertifikat richtig verstanden habe, aber das Credential gibt nichts zurück, keinen Fehler, nur null. Irgendeine Idee warum?

Antwort

1

Im ersten Teil meiner Frage habe ich versucht, einen kSecAttrApplicationTag in einem kSecClassCertificate hinzuzufügen, aber der kSecAttrApplicationTag wird nur in kSecClassKey akzeptiert.

Im zweiten Teil war das Ergebnis der Berechtigung (<NSURLCredential: 0x1e20d140>: (null)) richtig, diese "Null" bedeutet nicht, dass der Wert tatsächlich null ist. Auf diese Weise funktioniert mein Code einwandfrei.