如何在iPhone钥匙串中建立SecIdentityRef?(不使用.p12文件)

14
如何在iPhone钥匙串中创建一个SecIdentityRef对象,如果: 1)您已经在钥匙串中有私钥,并且 2)您刚刚收到证书?
在这种情况下,SecPKCS12Import没有帮助,除非有一种API可以从私钥和证书创建.p12文件。
在Mac上,SecIdentityCreateWithCertificate是答案,但在iPhone上不存在。
是否可以使用SecItemAdd方法实现? http://developer.apple.com/library/ios/#documentation/Security/Reference/keychainservices/Reference/reference.html 非常感谢,Andrew

可怜的我,我有完全相同的问题,而且我可以看到这个问题多年来一直没有得到解答。你解决了这个问题吗? - pmilosev
1个回答

22

好的,回答一下我自己的问题:

在iOS上,密钥链将自动绑定证书和私钥。这意味着您只需要:

  1. 生成密钥对
  2. 获取与私钥匹配的证书
  3. 将证书插入密钥链。

完成后,您应该能够获得证书/私钥的SecIdentityRef。

重要提示: SecItemAdd 函数允许您直接插入证书数据(DER表示形式的NSData)。 这样,您将能够获得有效的证书引用,但不是身份引用。
插入证书的正确方法是首先使用 SecCertificateCreateWithData 函数处理证书的DER字节。 这将返回一个 SecCertificateRef 对象,然后应使用 SecItemAdd 函数将证书持久化到密钥链中。

希望这会让某人的生活更轻松;-)

问候, Pece


注意:标记为“IMPORTANT”的东西非常重要。真的。 - 0rca
当您最终使用SecItemCopyMatching获取SecIdentityRef时,指定kSecAttrApplicationTag属性非常重要。标签必须与生成密钥对时指定的相同。即使您没有指定标签,仍然可以获得一些签名标识,但似乎是不完整或错误的:如果尝试从中提取私钥,则会返回公钥。我在iOS9.3上遇到了这个问题。 - Igor Vasilev
3
值得一提的是,没有办法使用第三方库(例如openssl)生成密钥对,并将其添加到钥匙串中,而不使用pkcs12作为中间格式以供SecPKCS12Import()使用。 - Jakob
@Jakob提出的最后一点非常有帮助和重要。 - Travis Griggs
和 @Ezos 一样的问题 - 我该如何获取 SecIdentityRef? - swalkner
显示剩余2条评论

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