如何在 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 将信用卡信息保存在钥匙串中或使用密码学? [关闭]