Импорт клиентского сертификата в ключевую мелку iPhone
-
26-10-2019 - |
Вопрос
Я пишу приложение, которое общается с сервером, которое требует от клиента аутентифицировать себя, используя сертификат клиента. Мне нужно извлечь сертификат из файла .p12 в пакет приложения и добавить его в ключевой матч приложения.
Я пытался выяснить, как заставить его работать с Apple «Сертификат, ключ и целевые услуги для iOS», но для меня это кажется неполным и не указывает, как я добавляю что -либо в ключ -майну (?).
Я довольно потерян, и любая помощь оценивается, заранее спасибо!
Решение
"Сертификат, ключ и целевые услуги для iOS"Содержит достаточную информацию для извлечения сертификата из файла .p12.
Из листинга 2-1 Демонстрируйте, как вы можете извлечь SecidentityRef
Из листинга 2-2 второй строки (// 1) показывает, как вы можете скопироватьSeccertificaterf из SecidentityRef.
пример Загрузка файла P12, извлечь сертификат, установить в ключ. (Обработка ошибок и управление памятью не была включена)
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