iPhone: 如何从公钥文件(PEM)创建SecKeyRef

14
为了发送和接收iPhone的加密消息,我需要读取公钥(服务器的公钥)PEM文件并创建一个SecKeyRef(以后我甚至可以将其存储在钥匙串中,以免再次创建它)。
这是我的当前工作流程:
  1. 在服务器上:使用用户的证书和私钥创建P12文件。在服务器的钥匙串上存储用户的公钥。
  2. 在iPhone上:从服务器检索P12文件,使用密码打开它并将私钥存储在钥匙串中。
  3. 在iPhone上:从服务器检索带有服务器公钥的PEM文件。创建一个SecKeyRef并将其存储在钥匙串中。
  4. 在iPhone上:使用两个密钥向服务器发送/接收加密消息。
  5. 从此过上幸福美满的生活。
我在第3步遇到了问题,因为我无法从PEM文件数据中创建SecKeyRef。 我找不到任何关于如何完成此操作的文档,请问有没有人遇到过相同的问题? 有什么提示吗?由于我找不到任何代码示例或文档,所以感觉我正在做错什么......谢谢!

请问您如何存储和检索密钥?如何在钥匙串中引用已存储的密钥?我和您的情况几乎相同。我想在iPhone上生成密钥对并将其存储在钥匙串中,然后稍后再检索它。我知道如何生成,但无法成功地从钥匙串中存储和检索。 - karim
我主要遇到的问题是第五个... :悲伤的声音:... - vatbub
1个回答

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
创建策略文件的一种方法:SecPolicyRef policy = SecPolicyCreateBasicX509(); - Isaac Paul
myCertData 是 NSData* 类型,但是 SecCertificateCreateWithData 函数需要的参数类型是 CFDataRef。可以通过 __bridge 转换为 CFDataRef 类型:CFDataRef myCertDataRef = (__bridge CFDataRef) myCertData; - Chuck Krutsinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接