如何创建与 MultiPeerConnectivity 一起使用的 SecIdentityRef?

How to create a SecIdentityRef to be used with MultiPeerConnectivity?

我需要在 Swift iOS 应用程序中为 MultiPeer Connectivity 交换实施身份验证部分。所以我需要在 MCSession 创建时创建一个 SecIdentityRef 对象(就像 MCSession(peer: myPeerId, securityIdentity: secIdentity, encryptionPreference: MCEncryptionPreference.Required) 一样)。

我已经创建了一个具有钥匙串访问权限的 X509 证书并将其保存到一个 .p12 文件中。我还有一个可以使用的 .cgi 和 .der 格式的证书。

我想知道这些证书中的任何一个是否值得在我的申请中使用,如果是的话如何使用?是不是可以直接把证书放在项目目录下,在app中导入它的数据,还是需要用服务器提供证书?

最后但同样重要的是,我不知道如何从给定的证书创建 SecIdentityRef。我曾尝试浏览 Apple Developer 的参考资料以查找 类 MCSessionSecIdentityRefSecCertificateRef 甚至 CFData,但我找不到任何可能对我有帮助的内容。

我想出了如何为 Multipeer Connectivity 会话建立导入证书。

在下面的示例中,我们假设我们拥有 supportedFiles/certificate.p12 下的证书。此外,您的证书必须受密码保护,因为我读到证书管理 API 不支持未受保护的证书。

func getIdentity (password : String?) -> SecIdentityRef? {
    // Load certificate file
    let path = NSBundle.mainBundle().pathForResource("certificate", ofType : "p12")
    let p12KeyFileContent = NSData(contentsOfFile: path!)

    if (p12KeyFileContent == nil) {
        NSLog("Cannot read PKCS12 file from \(path)")
        return nil
    }

    // Setting options for the identity "query"
    let options = [String(kSecImportExportPassphrase):password ?? ""]
    var citems: CFArray? = nil
    let resultPKCS12Import = withUnsafeMutablePointer(&citems) { citemsPtr in
        SecPKCS12Import(p12KeyFileContent!, options, citemsPtr)
    }
    if (resultPKCS12Import != errSecSuccess) {
        return nil
    }

    // Recover the identity
    let items = citems! as NSArray
    let myIdentityAndTrust = items.objectAtIndex(0) as! NSDictionary
    let identityKey = String(kSecImportItemIdentity)
    let identity = myIdentityAndTrust[identityKey] as! SecIdentity

    print("identity : ", identity)

    return identity as SecIdentityRef
}

但是我仍然不知道在应用程序文件中拥有证书是否会构成安全威胁。

编辑: 谢谢 neilco,他的代码片段帮助我构建了我的解决方案。