Обратите внимание, что этот вопрос был задан в 2001 году. Все изменилось.
У меня есть устройство iOS, которому требуется доступ к Junos VPN. Непрозрачные инструкции администратора Junos говорят, что мне нужно получить сертификат, который был предоставлен устройству с помощью Apple IPCU. Я знаю, что сертификат находится на устройстве (я вижу его в настройках), и я могу получить доступ к VPN через почту, Safari и приложение Junos.
В документации Apple указано, что у каждого приложения есть своя связка ключей, но все три приложения могут видеть сертификат. Тот факт, что Jusos может получить доступ к сертификату, предоставленному IPCU, означает, что любое приложение может получить доступ к этому сертификату. Однако когда я пытаюсь найти его:
CFTypeRef certificateRef = NULL; // will hold a ref to the cert we're trying to retrieve
const char *certLabelString = "myCertificateName"; // c string of the certificate we're searching for.
CFStringRef certLabel = CFStringCreateWithCString( NULL, certLabelString, kCFStringEncodingUTF8); // the search we need - a string match for a UTF8 String.
const void *keys[] = { kSecClass, kSecAttrLabel, kSecReturnRef };
const void *values[] = { kSecClassCertificate, certLabel, kCFBooleanTrue };
CFDictionaryRef dict = CFDictionaryCreate(NULL, keys, values, 3, NULL, NULL); // set up a search to retrieve this certificate.
OSStatus status = SecItemCopyMatching(dict, &certificateRef); // Search the keychain, returning in dict
if(status != errSecSuccess)
NSLog(@"keychain find returned %ld", status);
if(dict)
CFRelease(dict);
Это не удается. Мои вопросы:
Это правильный код? На самом деле я знаю
это не потому что
SecItemCopyMatching
возвращает
errSecItemNotFound
Какое значение следует использовать для
certLabelString
- я предполагаю, что
удобочитаемое имя показано в
Настройки.
В настройках сертификат выглядит так (к сожалению, запутанный до смерти) указанный мной поисковый текст - это именно тот текст, который отображается в настройках.
Перекрестная ссылка на Форумы разработчиков Apple