Импорт сертификата клиента в связку ключей iPhone
Я пишу приложение, которое взаимодействует с сервером, который требует, чтобы клиент аутентифицировал себя с помощью сертификата клиента. Мне нужно получить сертификат от А.файл p12 в пакете приложений и добавьте его в связку ключей приложений.
Я пытался выяснить, как заставить его работать из задач Apple "Certificate, Key, and Trust Services Tasks for iOS", но мне кажется, что он неполный и не указывает, как я добавляю что-либо в приложение. брелок (?).
Я совсем потерялся, и любая помощь приветствуется, заранее спасибо!
1 ответ:
"Certificate, Key, and Trust Services Tasks for iOS " содержит достаточно информации для извлечения сертификата из a .файл p12.
Из листинга 2-1 продемонстрируйте, как можно извлечь SecIdentityRef
Из листинга 2-2 вторая строка (//1) показывает, как вы можете копировать SecCertificateRef из SecIdentityRef.
Пример загрузка файла p12, извлечение сертификата, установка в keychain. (обработка ошибок и управление памятью не было включено)
NSString * password = @"Your-P12-File-Password"; NSString * path = [[NSBundle mainBundle] pathForResource:@"Your-P12-File" ofType:@"p12"]; // prepare password CFStringRef cfPassword = CFStringCreateWithCString(NULL, password.UTF8String, kCFStringEncodingUTF8); const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { cfPassword }; CFDictionaryRef optionsDictionary = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, NULL, NULL); // prepare p12 file content NSData * fileContent = [[NSData alloc] initWithContentsOfFile:path]; CFDataRef cfDataOfFileContent = (__bridge CFDataRef)fileContent; // extract p12 file content into items (array) CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); OSStatus status = errSecSuccess; status = SecPKCS12Import(cfDataOfFileContent, optionsDictionary, &items); // TODO: error handling on status // extract identity CFDictionaryRef yourIdentityAndTrust = CFArrayGetValueAtIndex(items, 0); const void *tempIdentity = NULL; tempIdentity = CFDictionaryGetValue(yourIdentityAndTrust, kSecImportItemIdentity); SecIdentityRef yourIdentity = (SecIdentityRef)tempIdentity; // get certificate from identity SecCertificateRef yourCertificate = NULL; status = SecIdentityCopyCertificate(yourIdentity, &yourCertificate); // at last, install certificate into keychain const void *keys2[] = { kSecValueRef, kSecClass }; const void *values2[] = { yourCertificate, kSecClassCertificate }; CFDictionaryRef dict = CFDictionaryCreate(kCFAllocatorDefault, keys2, values2, 2, NULL, NULL); status = SecItemAdd(dict, NULL); // TODO: error handling on status