2013-10-29 12 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でのみ受け入れられました。

2番目の部分では、資格情報(<NSURLCredential: 0x1e20d140>: (null))の結果は正しく、この「null」は値が実際にnullであることを意味しません。このようにして、私のコードは正常に動作します。