Импорт клиентского сертификата в ключевую мелку iPhone

StackOverflow https://stackoverflow.com/questions/8339510

Вопрос

Я пишу приложение, которое общается с сервером, которое требует от клиента аутентифицировать себя, используя сертификат клиента. Мне нужно извлечь сертификат из файла .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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top