2013-10-29 162 views
5

我想通過使用+credentialWithIdentity:certificates:persistence:方法創建一個NSURLCredential。但是它返回零。NSURLCredential創建返回null

我已經完成了以下步驟。首先我創建一個私鑰和公鑰,然後生成一個證書並將其添加到我的鑰匙串中。 第一個問題,當我這樣做:

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

狀態告訴我,我certificateTag是無效參數。 如果我不把這個標籤,我可以把我的鑰匙串中的證書,然後

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

我把

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

我的身份和證書正確方法,但該證書內一直沒有返回,不是一個錯誤,只是null。 任何想法爲什麼?

回答

1

在我的問題的第一部分,我試圖在kSecClassCertificate中添加kSecAttrApplicationTag,但kSecAttrApplicationTag只能在kSecClassKey中接受。

在第二部分中,憑證(<NSURLCredential: 0x1e20d140>: (null))的結果是正確的,但這個「null」並不意味着該值實際上爲空。保持這種方式我的代碼工作正常。