2013-10-29 1 views
5

+credentialWithIdentity:certificates:persistence: 메서드를 사용하여 NSURLCredential을 만들려고합니다. 그러나 그것은 아무것도 돌려주지 않습니다.null을 반환하는 NSURLCredential 만들기

다음 단계를 수행했습니다. 먼저 개인 및 공개 키를 만든 다음 인증서를 생성하고 키 체인에 추가합니다. 첫 번째 문제는, 내가 할 때 :

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 잘못된 인수입니다 말해. 나는이 태그를 넣지 마십시오 나는 내가 신원 및 인증서 권리를 가지고

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

넣어

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

방법,하지만 자격 증명 안에 다음, 내 키 체인에 인증서를 넣을 수 있습니다 경우 아무것도 반환하지 않고 오류가 아니라 단지 null을 반환합니다. 그 이유는 무엇입니까?

답변

1

제 질문의 첫 번째 부분에서 kSecClassCertificate에 kSecAttrApplicationTag를 추가하려고했지만 kSecAttrApplicationTag는 kSecClassKey에서만 허용되었습니다.

두 번째 부분에서는 자격 증명 (<NSURLCredential: 0x1e20d140>: (null))의 결과가 옳았습니다.이 "null"은 값이 실제로 null임을 의미하지 않습니다. 이 방법을 유지하면 코드가 정상적으로 작동합니다.