2013-10-29 15 views
5

Sto tentando di creare un NSURLCredential utilizzando il metodo +credentialWithIdentity:certificates:persistence:. Comunque sta tornando nullo.NSURCreazione ridenominazione restituita null

Ho eseguito i seguenti passaggi. Per prima cosa creo una chiave privata e pubblica, poi ho generato un certificato e l'ho aggiunto al mio portachiavi. Il primo problema, quando faccio questo:

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

Lo stato mi dicono che la mia certificateTag è un argomento non valido. Se non metto questo tag e posso mettere il certificato sul mio portachiavi, quindi all'interno del metodo

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

ho messo

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

ho preso l'identità e certificato di destra, ma la credenziale continua a restituire nulla, non un errore, solo null. Qualche idea sul perché?

risposta

1

Nella prima parte della mia domanda, stavo cercando di aggiungere un kSecAttrApplicationTag in un kSecClassCertificate, ma kSecAttrApplicationTag è accettato solo in kSecClassKey.

Nella seconda parte, il risultato delle credenziali (<NSURLCredential: 0x1e20d140>: (null)) era corretto, questo "null" non significa che il valore è effettivamente nullo. Mantenendo così il mio codice funziona bene.

Problemi correlati