2009-10-20 1 views
13

Для отправки и получения зашифрованных сообщений с/на iPhone мне нужно прочитать PEM-файл открытого ключа (сервера) и создать SecKeyRef (позже я мог бы даже хранить его на брелках, чтобы не создавать его снова).iPhone: как создать SecKeyRef из файла открытого ключа (PEM)

Это мой текущий рабочий процесс:

  1. На сервере: Создать P12 файл с сертификатом пользователя и секретным ключом. Храните открытый ключ пользователя в цепочке ключей сервера.
  2. На iPhone: извлеките файл P12 с сервера, используйте пароль, чтобы открыть его и сохранить закрытый ключ в цепочке ключей.
  3. На iPhone: получить файл PEM с открытым ключом сервера с сервера. Создайте SecKeyRef и сохраните его на цепочке ключей.
  4. На iPhone: используйте оба ключа для отправки/получения зашифрованных сообщений на/с сервера.
  5. Живите счастливо после этого.

У меня проблемы с 3, так как я не могу создать SecKeyRef из данных файла PEM. Я не могу найти документацию о том, как это сделать. У кого-то была такая же проблема? Любые намеки? Поскольку я не могу найти примеры кода или документацию по этому поводу, мне кажется, что я делаю что-то неправильно ...

спасибо!

+0

Не могли бы вы рассказать мне, как я могу хранить и извлекать ключи? Как обратиться к сохраненным ключам в цепочке ключей? У меня почти такой же сценарий, как и вы. Я хочу создать пару ключей в iPhone и сохранить в цепочке ключей. Затем позже захотите восстановить его. Я знаю, как сгенерировать, но не удалось сохранить и извлечь из брелка. – karim

ответ

7

Вы должны быть способны интерпретировать PER закодированный pem и получить сертификат, используя SecCertificateCreateWithData(), из которого вы можете извлечь ключ;

NSData *myCertData = ....; 

SecCertificateRef cert = SecCertificateCreateWithData (kCFAllocatorDefault, myCertData); 
CFArrayRef certs = CFArrayCreate(kCFAllocatorDefault, (const void **) &cert, 1, NULL); 

SecTrustRef trust; 
SecTrustCreateWithCertificates(certs, policy, &trust); 
SecTrustResultType trustResult; 
SecTrustEvaluate(trust, &trustResult); 
SecKeyRef pub_key_leaf = SecTrustCopyPublicKey(trust); 
+1

Спасибо! Знаете ли вы, какие ключи/значения следует использовать для хранения/извлечения этого ключа из брелка с помощью SecItemAdd/SecItemCopyMatching? – TehJabbit

+3

Как создать объект политики? фрагмент кода ничего не говорит о политике? – futureelite7

+2

Как мы получили эту myCertData? Скажем, у меня есть файл pub.pem, сгенерированный командой openssl, тогда я должен использовать этот код: NSData * myCertData = [[NSData alloc] initWithContentsOfFile: @ "public.pem"]; ? – Devarshi

 Смежные вопросы

  • Нет связанных вопросов^_^