2009-10-20 60 views
13

爲了向/從iPhone發送和接收加密消息,我需要讀取公鑰(服務器的公鑰)PEM文件並創建一個SecKeyRef(之後我甚至可以將它存儲在鑰匙串中,以免再次創建它)。iPhone:如何從公鑰文件(PEM)創建SecKeyRef

這是我目前的工作流程:

  1. 在服務器上:創建與用戶的證書和私鑰的P12文件。將用戶的公鑰存儲在服務器的鑰匙串中。
  2. 在iPhone上:從服務器中檢索P12文件,使用密碼將其打開並將私鑰存儲在鑰匙串中。
  3. 在iPhone上:使用服務器的服務器公鑰檢索PEM文件。創建一個SecKeyRef並將其存儲在鑰匙串上
  4. 在iPhone上:使用這兩個鍵向/從服務器發送/接收加密消息。
  5. 過着幸福的生活。

我遇到了問題3,因爲我無法從PEM文件數據創建SecKeyRef。我找不到有關如何操作的任何文檔,有沒有人遇到同樣的問題?任何提示?由於我找不到任何代碼示例或文檔,所以覺得我做錯了什麼...

謝謝!

+0

你能告訴我如何存儲和檢索密鑰?如何引用鑰匙串中存儲的密鑰?我有和你一樣的場景。我想在iPhone中生成密鑰對並存儲在鑰匙串中。然後想要檢索它。我知道如何生成,但無法成功存儲和從鑰匙串中檢索。 – karim

回答

7

您應該能夠解釋DER編碼的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的?假設我有一個由openssl命令生成的pub.pem文件,那麼我應該使用下面的代碼:NSData * myCertData = [[NSData alloc] initWithContentsOfFile:@「public.pem」]; ? – Devarshi

相關問題