2014-03-18 4 views
1

전자 메일 주소를 사용하여 키 체인 내에서 직접 인증서를 검색하려고합니다. 지금 가지고있는 것입니다 :전자 메일 주소로 키 체인에서 인증서 검색

OSStatus status = errSecSuccess; 


CFMutableDictionaryRef query = CFDictionaryCreateMutable(kCFAllocatorDefault, 4, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue); 
CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitAll); 
CFDictionaryAddValue(query, kSecClass, classType); 
CFDictionaryAddValue(query, kSecMatchEmailAddressIfPresent, (__bridge const void *)(emailAddress)); 

CFArrayRef result = nil; 
status = SecItemCopyMatching(query, (CFTypeRef *)&result); 
NSLog(@"Retrieved Item from Keychain With PersistedRef - Status: %@", [self tradeStatusForString:status]); 


if (query) 
    CFRelease(query); 

if(status != errSecSuccess) 
    return nil; 
else 
    return result; 

그러나 전자 메일 주소가있는 인증서 대신 모든 인증서가 제공됩니다. 나는 그 인증서가 이메일 주소를 가지고 있다는 사실을 알고 있으므로 여기에 무엇이 잘못 될 수 있는지 잘 모르겠습니다.

도움을 주시면 감사하겠습니다. 감사합니다. kSecMatchEmailAddressIfPresentAPI docs 상태에 있다는 것을

답변

1

나는 제대로 작동하려면 kSecMatchEmailAddressIfPresent을 얻을 수는 없지만 다른 해결책을 찾았습니다.

키 체인에 항목을 저장할 때 설정할 수있는 속성이 있습니다. 따라서 인증서를 저장할 때 이메일 주소로 kSecAttrLabel을 설정합니다.

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setValue:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnPersistentRef]; 
[query setValue:(__bridge id)item forKey:(__bridge id)kSecValueRef]; 
[query setValue:(id)emailAddress forKey:(__bridge id)kSecAttrLabel]; 

NSData *returnData = nil; 
status = SecItemAdd((__bridge CFDictionaryRef)query, (void *)&returnData); 

인증서를 조회 할 때 검색 매개 변수로 kSecAttrLabel을 포함 시켰습니다.

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setValue:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; 
[query setValue:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnPersistentRef]; 
[query setValue:(__bridge id)classType forKey:(__bridge id)kSecClass]; 
[query setValue:(id)emailAddress forKey:(__bridge id)kSecAttrLabel]; 

CFArrayRef result = nil; 
status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), (CFTypeRef *)&result); 

인증서가 이미 연결되어있는 전자 메일 주소를 이미 알고 있으므로이 기능은 저에게 유용합니다. 그러나 이전에 이메일을 모르는 경우 kSecPolicyName (Security Policy Keys) 또는 openssl에서 이메일을 추출 할 수 있습니다.

0

나는 키 체인 서비스 API와 경험이 없지만, 나는주의 :

[...] 인증서를 반환 또는 정체성 중 하나는 주소를 포함 것들로 제한됩니다 이메일 주소가이 아니어야합니다.

은 [강조 광산] 나에게

는 검색 결과가 당신이 찾고있는 이메일 주소를 포함하는 단지 것보다 더 인증서를 포함하는 것을 따라서 놀라운 일이 아니다.

불행히도, API가 이메일 주소가 전혀없는 검색 결과에서 인증서를 제외 할 수있는 방법이없는 것처럼 보입니다. (적어도 유용한 것으로 보이는 항목을 찾지 못했기 때문에) 항목을 수동으로 검색 결과 배열에 저장하십시오.

kSecMatchItemList을 지정하면 검색 결과 배열을 SecItemCopyMatching에 다시 입력 할 수 있습니다. 이 옵션은 반복적으로 검색 범위를 좁히는 데 유용 할 수 있지만 추가 검색 조건을 찾아 낼 수있는 경우에만 유용합니다.

+0

감사합니다. herzbube를 찾아 주셔서 감사합니다. kSecMatchEmailAddressIfPresent가 모든 인증서를 반환하고있는 것처럼 보이며 이메일 주소가있는 인증서도 반환합니다. 그래서 나는 불행히도 모든 인증서를 검색해야 할 것입니다. 나는'SecItemAdd'를 처음 호출 할 때 전자 메일 주소에 키 체인 속성을 설정하는 대체 솔루션을 발견했습니다. 그리고 이메일 주소로 인증서를 찾을 때 해당 키 체인 속성으로 검색합니다. – KrispyDonuts

관련 문제