如何在 iPhone 钥匙串中建立 SecIdentityRef? (没有 .p12)

Posted

技术标签:

【中文标题】如何在 iPhone 钥匙串中建立 SecIdentityRef? (没有 .p12)【英文标题】:How to establish a SecIdentityRef in an iPhone keychain ? (Without a .p12) 【发布时间】:2011-05-13 14:21:57 【问题描述】:

如何在 iPhone 钥匙串中创建 SecIdentityRef,如果 1)您已经在钥匙串中拥有私钥,并且 2) 您刚刚收到来自 CA 的证书?

SecPKCS12Import 在这种情况下没有帮助,除非有一个 API 可以从私钥和证书创建一个 .p12。

SecIdentityCreateWithCertificate 在 Mac 上是答案,但在 iPhone 上不存在。

是否可以使用 SecItemAdd ? http://developer.apple.com/library/ios/#documentation/Security/Reference/keychainservices/Reference/reference.html

非常感谢,安德鲁

【问题讨论】:

可怜的我;我有完全相同的问题,我可以看到这个问题多年来一直没有答案。你解决了这个问题吗? 【参考方案1】:

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

在 iOS 上,钥匙串会自动将证书绑定到私钥。这意味着您只需:

    生成密钥对 获取与私钥匹配的证书 将证书插入钥匙串。

在此之后,您应该能够获得证书/私钥的 SecIdentityRef。

重要提示: SecItemAdd 函数允许您直接插入证书数据(DER 表示的 NSData)。这样,您将能够获得有效的证书参考,但不能获得身份参考。 插入证书的正确方法是首先对证书的DER字节使用SecCertificateCreateWithData函数。这将返回一个 SecCertificateRef 对象,然后应该使用该对象将证书保存到使用 SecItemAdd 函数的钥匙串中。

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

问候, 佩斯

【讨论】:

自我注意:标记为重要的东西很重要。真的。 当您最终使用 SecItemCopyMatching 获得 SecIdentityRef 时,指定 kSecAttrApplicationTag 属性也很重要。该标签必须与您在生成密钥对时指定的相同。即使您不指定标记,您仍然可以获得一些签名身份,但它似乎不完整或错误:如果您尝试从中提取私钥,它将返回一个公共密钥。我在 iOS9.3 上遇到这种情况 我认为值得补充的是,在不使用 pkcs12 作为中间格式用于 SecPKCS12Import() 的情况下,无法使用第三方库(例如 openssl)生成密钥对并将其添加到钥匙串中 @Jakob 的最后一点非常有用且重要 在这方面需要帮助,这很好,存储证书,但身份,创建 NSURLCredential 我不知道如何获取或从哪里获取,我假设它在我的密钥库中证书,但不知道如何判断。如果我将密钥存储到密钥库中,是什么使它链接到证书???任何地方都没有这方面的文档。现在已经解决问题 80 多个小时了。

以上是关于如何在 iPhone 钥匙串中建立 SecIdentityRef? (没有 .p12)的主要内容,如果未能解决你的问题,请参考以下文章

Iphone 将信用卡信息保存在钥匙串中或使用密码学? [关闭]

如何查看 iPhone 模拟器的钥匙串

Xcode - iPhone - 配置文件与默认钥匙串中的任何有效证书/私钥对不匹配

将 .p12 证书存储在钥匙串中以供以后使用

代码签名错误:与默认钥匙串中的密钥对不匹配

如何检查用户名和密码是不是已保存在钥匙串中