2009-10-20 9 views
13

Aby wysyłać i odbierać zaszyfrowane wiadomości z/do iPhone'a, muszę odczytać klucz publiczny (klucz publiczny serwera) PEM i utworzyć SecKeyRef (później mogłem nawet przechowywać go na pęku kluczy, aby go nie utworzyć ponownie).iPhone: Jak utworzyć SecKeyRef z pliku klucza publicznego (PEM)

To jest mój obecny workflow:

  1. Na serwerze: Utwórz plik P12 z certyfikatem użytkownika i klucza prywatnego. Przechowuj publiczny klucz użytkownika na pęku kluczy serwera.
  2. Na iPhone: pobierz plik P12 z serwera, użyj hasła, aby je otworzyć i zapisać klucz prywatny na pęku kluczy.
  3. Na iPhone: pobierz plik PEM z kluczem publicznym serwera z serwera. Utwórz SecKeyRef i zapisz go na pęku kluczy. Na iPhone: użyj obu klawiszy do wysyłania/odbierania zaszyfrowanych wiadomości do/z serwera.
  4. Żyj długo i szczęśliwie.

Mam problemy z 3, ponieważ nie mogę utworzyć SecKeyRef z danych pliku PEM. Nie mogę znaleźć żadnej dokumentacji, jak to zrobić, Czy ktoś miał ten sam problem? Jakieś wskazówki? Ponieważ nie mogę znaleźć żadnych przykładów kodu ani dokumentacji na ten temat, czuję, że robię coś nie tak ...

dziękuję!

+0

Czy możesz mi powiedzieć, jak mogę przechowywać i odzyskać klucze? Jak odnosić się do przechowywanych kluczy w pęku kluczy? Mam prawie taki sam scenariusz jak ty. Chcę wygenerować klucz pary w iPhone i przechowywać w pęku kluczy. Później chcesz go odzyskać. Wiem, jak generować, ale nie udało się zapisać i pobrać z pęku kluczy. – karim

Odpowiedz

7

Powinieneś być w stanie zinterpretować PEM kodowane PEM i uzyskać certyfikat za pomocą SecCertificateCreateWithData(), z którego następnie można wyodrębnić klucz;

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

Dzięki! Czy wiesz, które klucze/wartości należy użyć do przechowywania/pobierania tego klucza z pęku kluczy przy użyciu SecItemAdd/SecItemCopyMatching? – TehJabbit

+3

Jak utworzyć obiekt polityki? w fragmencie kodu nie ma nic o polityce? – futureelite7

+2

Jak uzyskaliśmy ten myCertData? Powiedzmy, że mam plik pub.pem wygenerowany z polecenia openssl, a następnie powinienem użyć tego kodu: NSData * myCertData = [[przydział NSData] initWithContentsOfFile: @ "public.pem"]; ? – Devarshi

Powiązane problemy